Her zaman için gereken minimum sürümü belirtin cmake
cmake_minimum_required(VERSION 3.9)
Bir proje ilan etmelisiniz. cmake
zorunludur ve uygun değişkenleri tanımlamak söyler PROJECT_NAME
, PROJECT_VERSION
ve PROJECT_DESCRIPTION
(3.9 cmake bu ikinci değişken gerekmek):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
Yeni bir kütüphane hedefi bildirin. Lütfen kullanımından kaçının file(GLOB ...)
. Bu özellik, derleme sürecine katılmış ustalık sağlamaz. Tembelseniz, aşağıdakilerin kopyala-yapıştır çıktısı ls -1 sources/*.cpp
:
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
Set VERSION
özelliği (isteğe bağlı, ancak iyi bir uygulamadır):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
Ayrıca SOVERSION
çok sayıda olarak ayarlayabilirsiniz VERSION
. Yani libmylib.so.1
bir sembolik bağlantı olacak libmylib.so.1.0.0
.
set_target_properties(mylib PROPERTIES SOVERSION 1)
Kütüphanenizin herkese açık API'sını bildirin. Bu API üçüncü taraf uygulaması için yüklenecek. Proje ağacınızda izole etmek iyi bir uygulamadır ( include/
dizini yerleştirmek gibi ). Özel üstbilgilerin yüklenmemesi gerektiğine dikkat edin ve bunları kaynak dosyalarla birlikte yerleştirmenizi önemle öneririm.
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
Alt dizinlerle çalışıyorsanız, gibi göreli yollar eklemek çok uygun değildir "../include/mylib.h"
. Bu nedenle, dahil edilen dizinlerde bir üst dizini geçirin:
target_include_directories(mylib PRIVATE .)
veya
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
Kitaplığınız için bir yükleme kuralı oluşturun. Ben CMAKE_INSTALL_*DIR
tanımlanmış değişkenleri kullanmanızı öneririz GNUInstallDirs
:
include(GNUInstallDirs)
Ve yüklenecek dosyaları bildirin:
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
Ayrıca bir pkg-config
dosyayı dışa aktarabilirsiniz . Bu dosya, üçüncü taraf bir uygulamanın kitaplığınızı kolayca içe aktarmasına izin verir:
Adlı bir şablon dosyası oluşturun mylib.pc.in
( daha fazla bilgi için pc (5) kılavuzuna bakınız ):
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}
Gözlerinde farklı CMakeLists.txt
, genişletmek için bir kural eklemek @
makro ( @ONLY
formun değişkenleri genişletmek değil CKağıt sormak ${VAR}
):
configure_file(mylib.pc.in mylib.pc @ONLY)
Ve son olarak, oluşturulan dosyayı yükleyin:
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
Ayrıca cmake EXPORT
özelliğini de kullanabilirsiniz . Ancak, bu özellik sadece uyumlu cmake
ve kullanımı zor buluyorum.
Sonunda, bütün CMakeLists.txt
şöyle görünmelidir:
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)