Specifica sempre la versione minima richiesta di cmake
cmake_minimum_required(VERSION 3.9)
Dovresti dichiarare un progetto. cmake
dice che è obbligatorio e definirà variabili convenienti PROJECT_NAME
, PROJECT_VERSION
e 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 VERSION
proprietà (facoltativo ma è una buona pratica):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
Puoi anche impostare SOVERSION
un numero maggiore di VERSION
. Quindi libmylib.so.1
sarà 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_*DIR
definite 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-config
file. 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 ( @ONLY
chiedi 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 cmake
e trovo difficile da usare.
Infine l'intero CMakeLists.txt
dovrebbe 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)