Geben Sie immer die minimal erforderliche Version von an cmake
cmake_minimum_required(VERSION 3.9)
Sie sollten ein Projekt deklarieren. cmake
sagt, dass es obligatorisch ist und bequeme Variablen definiert PROJECT_NAME
, PROJECT_VERSION
und PROJECT_DESCRIPTION
(diese letztere Variable erfordert cmake 3.9):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
Deklarieren Sie ein neues Bibliotheksziel. Bitte vermeiden Sie die Verwendung von file(GLOB ...)
. Diese Funktion bietet keine kontrollierte Beherrschung des Kompilierungsprozesses. Wenn Sie faul sind, kopieren Sie die Ausgabe von ls -1 sources/*.cpp
:
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
VERSION
Eigenschaft festlegen (optional, aber eine gute Vorgehensweise):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
Sie können auch SOVERSION
eine große Anzahl von einstellen VERSION
. Also libmylib.so.1
wird ein Symlink zu libmylib.so.1.0.0
.
set_target_properties(mylib PROPERTIES SOVERSION 1)
Deklarieren Sie die öffentliche API Ihrer Bibliothek. Diese API wird für die Drittanbieteranwendung installiert. Es wird empfohlen, es in Ihrem Projektbaum zu isolieren (z. B. im include/
Verzeichnis zu platzieren). Beachten Sie, dass private Header nicht installiert werden sollten, und ich empfehle dringend, sie zusammen mit den Quelldateien zu platzieren.
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
Wenn Sie mit Unterverzeichnissen arbeiten, ist es nicht sehr praktisch, relative Pfade wie einzuschließen "../include/mylib.h"
. Übergeben Sie also ein Top-Verzeichnis in den enthaltenen Verzeichnissen:
target_include_directories(mylib PRIVATE .)
oder
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
Erstellen Sie eine Installationsregel für Ihre Bibliothek. Ich schlage vor, Variablen zu verwenden, die CMAKE_INSTALL_*DIR
definiert sind in GNUInstallDirs
:
include(GNUInstallDirs)
Und deklarieren Sie die zu installierenden Dateien:
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
Sie können auch eine pkg-config
Datei exportieren . Mit dieser Datei kann eine Drittanbieteranwendung Ihre Bibliothek problemlos importieren:
Erstellen Sie eine Vorlagendatei mit dem Namen mylib.pc.in
( weitere Informationen finden Sie in der Manpage zu PC (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}
Fügen Sie in Ihrem CMakeLists.txt
eine Regel hinzu, um @
Makros zu erweitern ( @ONLY
fragen Sie cmake, um Variablen des Formulars nicht zu erweitern ${VAR}
):
configure_file(mylib.pc.in mylib.pc @ONLY)
Und schließlich installieren Sie die generierte Datei:
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
Sie können auch die cmake- EXPORT
Funktion verwenden . Diese Funktion ist jedoch nur mit kompatibel cmake
und ich finde es schwierig, sie zu verwenden.
Schließlich CMakeLists.txt
sollte das Ganze so aussehen:
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)