Selalu tentukan versi minimum yang diwajibkan cmake
cmake_minimum_required(VERSION 3.9)
Anda harus mendeklarasikan sebuah proyek. cmake
mengatakan itu wajib dan itu akan menentukan variabel yang nyaman PROJECT_NAME
, PROJECT_VERSION
dan PROJECT_DESCRIPTION
(variabel terakhir ini memerlukan cmake 3.9):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
Deklarasikan target perpustakaan baru. Harap hindari penggunaan file(GLOB ...)
. Fitur ini tidak memberikan penguasaan proses kompilasi. Jika Anda malas, hasil copy-paste dari ls -1 sources/*.cpp
:
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
Set VERSION
properti (opsional tetapi ini adalah praktik yang baik):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
Anda juga dapat mengatur SOVERSION
ke sejumlah besar VERSION
. Jadi libmylib.so.1
akan menjadi symlink ke libmylib.so.1.0.0
.
set_target_properties(mylib PROPERTIES SOVERSION 1)
Deklarasikan API publik perpustakaan Anda. API ini akan dipasang untuk aplikasi pihak ketiga. Ini adalah praktik yang baik untuk mengisolasinya di pohon proyek Anda (seperti menempatkan include/
direktori itu ). Perhatikan bahwa, tajuk pribadi tidak boleh dipasang dan saya sangat menyarankan untuk menempatkannya dengan file sumber.
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
Jika Anda bekerja dengan subdirektori, sangat tidak nyaman untuk menyertakan jalur relatif seperti "../include/mylib.h"
. Jadi, teruskan direktori teratas di direktori yang disertakan:
target_include_directories(mylib PRIVATE .)
atau
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
Buat aturan instal untuk perpustakaan Anda. Saya menyarankan untuk menggunakan variabel yang CMAKE_INSTALL_*DIR
ditentukan dalam GNUInstallDirs
:
include(GNUInstallDirs)
Dan nyatakan file untuk diinstal:
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
Anda juga dapat mengekspor pkg-config
file. File ini memungkinkan aplikasi pihak ketiga untuk dengan mudah mengimpor perpustakaan Anda:
Buat file template bernama mylib.pc.in
(lihat pc (5) halaman manual untuk informasi lebih lanjut):
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}
Di Anda CMakeLists.txt
, tambahkan aturan untuk memperluas @
makro ( @ONLY
minta cmake untuk tidak memperluas variabel formulir ${VAR}
):
configure_file(mylib.pc.in mylib.pc @ONLY)
Dan terakhir, instal file yang dihasilkan:
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
Anda juga dapat menggunakan fitur cmakeEXPORT
. Namun, fitur ini hanya kompatibel cmake
dan menurut saya sulit untuk digunakan.
Akhirnya keseluruhannya CMakeLists.txt
akan terlihat seperti:
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)