Завжди вказуйте мінімально необхідну версію cmake
cmake_minimum_required(VERSION 3.9)
Вам слід заявити про проект. cmake
говорить, що це обов'язково, і він визначатиме зручні змінні PROJECT_NAME
, PROJECT_VERSION
і PROJECT_DESCRIPTION
(ця остання змінна потребує cmake 3.9):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
Оголосіть нову ціль бібліотеки. Будь ласка, уникайте використання file(GLOB ...)
. Ця особливість не забезпечує відвідування процесу компіляції. Якщо ви ліниві, скопіюйте вихід ls -1 sources/*.cpp
:
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
Встановити VERSION
властивість (необов’язково, але це є хорошою практикою):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
Ви також можете встановити SOVERSION
основну кількість VERSION
. Так libmylib.so.1
буде символьним посиланням на libmylib.so.1.0.0
.
set_target_properties(mylib PROPERTIES SOVERSION 1)
Декларуйте загальнодоступний API своєї бібліотеки. Цей API буде встановлено для стороннього додатка. Ізолювати його у вашому дереві проектів (наприклад, розміщуючи його в include/
каталозі). Зауважте, приватні заголовки не повинні встановлюватися, і я настійно пропоную розмістити їх у вихідних файлах.
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
Якщо ви працюєте з підкаталогами, не дуже зручно включати відносні шляхи на зразок "../include/mylib.h"
. Отже, передайте головний каталог у включені каталоги:
target_include_directories(mylib PRIVATE .)
або
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
Створіть правило встановлення для вашої бібліотеки. Я пропоную використовувати змінні, CMAKE_INSTALL_*DIR
визначені в GNUInstallDirs
:
include(GNUInstallDirs)
І оголосити файли для встановлення:
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
Ви також можете експортувати pkg-config
файл. Цей файл дозволяє сторонній програмі легко імпортувати вашу бібліотеку:
Створіть файл шаблону з ім'ям mylib.pc.in
(див шт (5) сторінка керівництва для отримання додаткової інформації):
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=@CMAKE_INSTALL_PREFIX@
libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@
Requires:
Libs: -L${libdir} -lmylib
Cflags: -I${includedir}
У свій CMakeLists.txt
додайте правило для розширення @
макросів ( @ONLY
попросіть cmake не розширювати змінні форми ${VAR}
):
configure_file(mylib.pc.in mylib.pc @ONLY)
І нарешті, встановіть створений файл:
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
Ви також можете використовувати функцію cmakeEXPORT
. Однак ця функція сумісна лише cmake
і мені важко користуватися.
Нарешті, все CMakeLists.txt
має виглядати так:
cmake_minimum_required(VERSION 3.9)
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
include(GNUInstallDirs)
add_library(mylib SHARED src/mylib.c)
set_target_properties(mylib PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 1
PUBLIC_HEADER api/mylib.h)
configure_file(mylib.pc.in mylib.pc @ONLY)
target_include_directories(mylib PRIVATE .)
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)