Specifica sempre la versione minima richiesta di cmake
cmake_minimum_required(VERSION 3.9)
Dovresti dichiarare un progetto. cmakedice che è obbligatorio e definirà variabili convenienti PROJECT_NAME, PROJECT_VERSIONe PROJECT_DESCRIPTION(quest'ultima variabile richiede cmake 3.9):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
Dichiarare un nuovo target di libreria. Si prega di evitare l'uso di file(GLOB ...). Questa funzione non fornisce una padronanza attenta del processo di compilazione. Se sei pigro, copia e incolla l'output di ls -1 sources/*.cpp:
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
Imposta VERSIONproprietà (facoltativo ma è una buona pratica):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
Puoi anche impostare SOVERSIONun numero maggiore di VERSION. Quindi libmylib.so.1sarà un link simbolico a libmylib.so.1.0.0.
set_target_properties(mylib PROPERTIES SOVERSION 1)
Dichiara l'API pubblica della tua libreria. Questa API verrà installata per l'applicazione di terze parti. È buona norma isolarlo nell'albero del progetto (come posizionarlo nella include/directory). Si noti che le intestazioni private non devono essere installate e consiglio vivamente di inserirle nei file di origine.
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
Se lavori con le sottodirectory, non è molto conveniente includere percorsi relativi come "../include/mylib.h". Quindi, passa una directory principale nelle directory incluse:
target_include_directories(mylib PRIVATE .)
o
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
Crea una regola di installazione per la tua libreria. Suggerisco di usare le variabili CMAKE_INSTALL_*DIRdefinite in GNUInstallDirs:
include(GNUInstallDirs)
E dichiarare i file da installare:
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
Puoi anche esportare un pkg-configfile. Questo file consente a un'applicazione di terze parti di importare facilmente la tua libreria:
Creare un file modello denominato mylib.pc.in(consultare la manpage pc (5) per ulteriori informazioni):
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}
Nel tuo CMakeLists.txt, aggiungi una regola per espandere le @macro ( @ONLYchiedi a cmake di non espandere le variabili del modulo ${VAR}):
configure_file(mylib.pc.in mylib.pc @ONLY)
E infine, installa il file generato:
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
Puoi anche usare la funzione cmakeEXPORT . Tuttavia, questa funzione è compatibile solo con cmakee trovo difficile da usare.
Infine l'intero CMakeLists.txtdovrebbe apparire come:
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)