ระบุเวอร์ชันที่ต้องการขั้นต่ำของ cmake
cmake_minimum_required(VERSION 3.9)
คุณควรประกาศโครงการ cmake
บอกว่ามันมีผลบังคับใช้และจะกำหนดตัวแปรสะดวกPROJECT_NAME
, PROJECT_VERSION
และPROJECT_DESCRIPTION
(นี่เลี่ยงตัวแปรหลัง CMake 3.9):
project(mylib VERSION 1.0.1 DESCRIPTION "mylib description")
ประกาศเป้าหมายไลบรารีใหม่ โปรดหลีกเลี่ยงการใช้file(GLOB ...)
. คุณลักษณะนี้ไม่ได้ให้ความเชี่ยวชาญในกระบวนการคอมไพล์ หากคุณขี้เกียจคัดลอกและวางผลลัพธ์ของls -1 sources/*.cpp
:
add_library(mylib SHARED
sources/animation.cpp
sources/buffers.cpp
[...]
)
ตั้งค่าVERSION
คุณสมบัติ (เป็นทางเลือก แต่เป็นแนวทางปฏิบัติที่ดี):
set_target_properties(mylib PROPERTIES VERSION ${PROJECT_VERSION})
นอกจากนี้คุณยังสามารถตั้งค่าไปยังหมายเลขที่สำคัญของSOVERSION
VERSION
ดังนั้นlibmylib.so.1
จะ symlink libmylib.so.1.0.0
ไป
set_target_properties(mylib PROPERTIES SOVERSION 1)
ประกาศ API สาธารณะของห้องสมุดของคุณ API นี้จะถูกติดตั้งสำหรับแอปพลิเคชันของบุคคลที่สาม เป็นแนวทางปฏิบัติที่ดีในการแยกไว้ในแผนผังโครงการของคุณ (เช่นการวางinclude/
ไดเรกทอรี) โปรดสังเกตว่าไม่ควรติดตั้งส่วนหัวส่วนตัวและฉันขอแนะนำอย่างยิ่งให้วางไว้กับไฟล์ต้นฉบับ
set_target_properties(mylib PROPERTIES PUBLIC_HEADER include/mylib.h)
หากคุณทำงานกับไดเร็กทอรีย่อยการรวมพา ธ สัมพัทธ์เช่น"../include/mylib.h"
. ดังนั้นส่งไดเรกทอรีชั้นนำในไดเรกทอรีที่รวมไว้:
target_include_directories(mylib PRIVATE .)
หรือ
target_include_directories(mylib PRIVATE include)
target_include_directories(mylib PRIVATE src)
สร้างกฎการติดตั้งสำหรับไลบรารีของคุณ ฉันขอแนะนำให้ใช้ตัวแปรที่CMAKE_INSTALL_*DIR
กำหนดในGNUInstallDirs
:
include(GNUInstallDirs)
และประกาศไฟล์ที่จะติดตั้ง:
install(TARGETS mylib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
คุณยังสามารถส่งออกpkg-config
ไฟล์ ไฟล์นี้อนุญาตให้แอปพลิเคชันบุคคลที่สามนำเข้าไลบรารีของคุณได้อย่างง่ายดาย:
สร้างไฟล์เท็มเพลตชื่อmylib.pc.in
(ดูpc (5) manpage สำหรับข้อมูลเพิ่มเติม):
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}
ในของคุณCMakeLists.txt
เพิ่มกฎเพื่อขยาย@
มาโคร ( @ONLY
ขอให้ cmake เพื่อไม่ขยายตัวแปรของแบบฟอร์ม${VAR}
):
configure_file(mylib.pc.in mylib.pc @ONLY)
และสุดท้ายติดตั้งไฟล์ที่สร้างขึ้น:
install(FILES ${CMAKE_BINARY_DIR}/mylib.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
นอกจากนี้คุณยังอาจจะใช้CMakeEXPORT
คุณลักษณะ อย่างไรก็ตามฟีเจอร์นี้ใช้ได้กับcmake
และฉันพบว่ามันยากที่จะใช้
สุดท้ายทั้งหมดCMakeLists.txt
ควรมีลักษณะดังนี้:
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)