很好!我們進入 第八課:構建并導出可復用的 CMake 庫(支持 find_package()
查找)。
🎯 本課目標
你將掌握:
-
如何構建一個庫并通過
install()
導出其配置; -
如何讓別人在項目中使用
find_package(MyMathLib)
來找到你的庫; -
install(EXPORT ...)
與CMake Package Config
的標準結構; -
自己項目變成像 Qt / Boost / OpenCV 那樣被“可復用”的第三方庫。
一、場景:我們要讓 math_lib
成為“真正的可復用庫”
即別人可以這樣用你:
find_package(MyMathLib REQUIRED)
target_link_libraries(their_app PRIVATE MyMathLib::math_lib)
二、導出 CMake 包需要做的幾步
步驟 | 操作 |
---|---|
1?? 安裝目標 | install(TARGETS ...) 安裝庫 |
2?? 安裝頭文件 | install(FILES ...) 安裝接口頭 |
3?? 導出目標信息 | install(EXPORT ...) |
4?? 安裝 CMake 配置文件 | 寫 MyMathLibConfig.cmake |
5?? 生成版本描述文件 | 使用 write_basic_package_version_file() |
三、完整示例:導出 math_lib 包
假設項目結構如下:
my_math_lib/
├── CMakeLists.txt
├── math/
│ ├── CMakeLists.txt
│ ├── add.h
│ └── add.cpp
└── cmake/└── MyMathLibConfig.cmake.in
📄 頂層 CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(MyMathLib VERSION 1.0 LANGUAGES CXX)# 創建導出組名(可選)
include(GNUInstallDirs)add_subdirectory(math)# 生成版本文件
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/MyMathLibConfigVersion.cmake"VERSION ${PROJECT_VERSION}COMPATIBILITY SameMajorVersion
)# 安裝配置文件
configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/MyMathLibConfig.cmake.in""${CMAKE_CURRENT_BINARY_DIR}/MyMathLibConfig.cmake"INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyMathLib
)# 安裝配置 + 導出目標
install(FILES"${CMAKE_CURRENT_BINARY_DIR}/MyMathLibConfig.cmake""${CMAKE_CURRENT_BINARY_DIR}/MyMathLibConfigVersion.cmake"DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyMathLib
)
📄 math/CMakeLists.txt
add_library(math_lib add.cpp)
target_include_directories(math_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})# 設置導出別名(名字空間)
add_library(MyMathLib::math_lib ALIAS math_lib)# 安裝目標
install(TARGETS math_libEXPORT MyMathLibTargetsARCHIVE DESTINATION libLIBRARY DESTINATION libRUNTIME DESTINATION binINCLUDES DESTINATION include
)# 安裝頭文件
install(FILES add.h DESTINATION include)# 導出目標信息(用于 find_package)
install(EXPORT MyMathLibTargetsNAMESPACE MyMathLib::DESTINATION lib/cmake/MyMathLib
)
📄 cmake/MyMathLibConfig.cmake.in
@PACKAGE_INIT@include("${CMAKE_CURRENT_LIST_DIR}/MyMathLibTargets.cmake")
四、構建 + 安裝 + 使用流程
? 構建并安裝:
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=D:/MyMathLib/install
cmake --build . --config Release
cmake --install . --config Release
📁 安裝目錄結構(標準化)
D:/MyMathLib/install/
├── include/
│ └── add.h
├── lib/
│ └── math_lib.lib
├── lib/cmake/MyMathLib/
│ ├── MyMathLibTargets.cmake
│ ├── MyMathLibConfig.cmake
│ └── MyMathLibConfigVersion.cmake
五、別人的項目如何使用你這個庫?
示例 CMakeLists.txt:
cmake_minimum_required(VERSION 3.14)
project(UserProject LANGUAGES CXX)set(CMAKE_PREFIX_PATH "D:/MyMathLib/install") # 設置查找路徑find_package(MyMathLib REQUIRED)add_executable(app main.cpp)
target_link_libraries(app PRIVATE MyMathLib::math_lib)
? 小結
組件 | 用途 |
---|---|
install(EXPORT ...) | 導出目標給別人用 |
MyMathLibConfig.cmake.in | 配置包的入口文件 |
write_basic_package_version_file() | 提供版本信息 |
一旦配置好,你的庫就能被任何支持 find_package()
的項目復用了。
?? 下一課預告:跨平臺支持與條件判斷(if、platform-specific)
你將學會:
-
如何為 Windows / Linux / macOS 寫不同邏輯
-
如何處理編譯器差異(如 MSVC / GCC)
-
用
option()
設置用戶開關(如是否啟用日志、測試)
是否希望我把這個完整導出庫模板也整理進 Canvas?或者你希望我打包為 zip 并生成目錄結構?