Zawsze określaj minimalną wymaganą wersję cmake
cmake_minimum_required(VERSION 3.9)
Powinieneś zgłosić projekt. cmake
mówi, że jest to obowiązkowe i zdefiniuje wygodne zmienne PROJECT_NAME
, PROJECT_VERSION
i PROJECT_DESCRIPTION
(ta ostatnia zmienna wymaga cmake 3.9):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
Zadeklaruj nowy cel biblioteki. Prosimy unikać używania file(GLOB ...)
. Ta funkcja nie zapewnia biegłego opanowania procesu kompilacji. Jeśli jesteś leniwy, skopiuj i wklej wyjście ls -1 sources/*.cpp
:
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
Ustaw VERSION
właściwość (opcjonalna, ale jest to dobra praktyka):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
Możesz również ustawić SOVERSION
większą liczbę plików VERSION
. Więc libmylib.so.1
będzie dowiązanie symboliczne do libmylib.so.1.0.0
.
set_target_properties(mylib PROPERTIES SOVERSION 1)
Zadeklaruj publiczny interfejs API swojej biblioteki. Ten interfejs API zostanie zainstalowany dla aplikacji innej firmy. Dobrą praktyką jest odizolowanie go w drzewie projektu (np. Umieszczenie go w include/
katalogu). Zauważ, że nagłówki prywatne nie powinny być instalowane i zdecydowanie sugeruję umieszczenie ich razem z plikami źródłowymi.
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
Jeśli pracujesz z podkatalogami, dołączanie ścieżek względnych, takich jak "../include/mylib.h"
. Więc przekaż główny katalog w dołączonych katalogach:
target_include_directories(mylib PRIVATE .)
lub
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
Utwórz regułę instalacji dla swojej biblioteki. Proponuję używać zmiennych CMAKE_INSTALL_*DIR
zdefiniowanych w GNUInstallDirs
:
include(GNUInstallDirs)
I zadeklaruj pliki do zainstalowania:
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
Możesz także wyeksportować pkg-config
plik. Ten plik umożliwia aplikacji innej firmy łatwe importowanie Twojej biblioteki:
Utwórz plik szablonu o nazwie mylib.pc.in
(zobacz stronę podręcznika pc (5), aby uzyskać więcej informacji):
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}
W swoim CMakeLists.txt
dodaj regułę rozwijania @
makr ( @ONLY
poproś, aby cmake nie rozwijał zmiennych formularza ${VAR}
):
configure_file(mylib.pc.in mylib.pc @ONLY)
Na koniec zainstaluj wygenerowany plik:
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
Możesz także skorzystać z funkcji cmakeEXPORT
. Jednak ta funkcja jest kompatybilna tylko z cmake
i jest trudna w użyciu.
Wreszcie całość CMakeLists.txt
powinna wyglądać następująco:
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)