CMake编译外部依赖库并安装到项目指定目录的技术问题
CMake依赖库源码管理与安装方案
1. 依赖库L源码的标准存放位置
通常有两种主流的标准位置,可根据项目规模和团队习惯选择:
- 项目根目录下的
third_party/L:最常用的方式,将所有第三方依赖集中放在third_party目录下,和自研代码明确隔离,方便团队协作与版本管理(比如用Git Submodule管理L的源码版本)。 - 项目根目录下的
external/L:和third_party作用类似,部分项目会用这个命名,语义上更强调"外部依赖"属性。
2. 将L的静态库安装到项目A的/lib目录
有两种常用实现方式,可根据是否能修改L的CMake配置选择:
方式一:修改L的CMakeLists.txt(有权限修改L源码时)
在L的根目录CMakeLists.txt末尾添加install命令,指定静态库的安装路径:
# 假设L编译生成的静态库目标名为L(CMake会自动添加平台前缀后缀,比如Linux下的libL.a) install(TARGETS L ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib CONFIGURATIONS Release)
编译L时,通过CMAKE_INSTALL_PREFIX指定项目A的根目录:
# 进入L的构建目录 cd path/to/L/build cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/projectA -DCMAKE_BUILD_TYPE=Release cmake --build . --target install
执行完成后,静态库会被自动安装到/path/to/projectA/lib目录。
方式二:在项目A中用ExternalProject_Add自动编译安装(无需修改L源码)
在项目A的根目录CMakeLists.txt中添加:
include(ExternalProject) ExternalProject_Add( libL SOURCE_DIR ${CMAKE_SOURCE_DIR}/third_party/L BINARY_DIR ${CMAKE_BINARY_DIR}/libL-build CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${CMAKE_SOURCE_DIR} INSTALL_COMMAND cmake --build . --target install )
编译项目A时,CMake会自动拉取、编译L,并将静态库安装到项目A的lib目录。
3. 将L的头文件安装到项目A的/include目录
同样分两种适配场景:
方式一:修改L的CMakeLists.txt
如果L的头文件存放在src/include目录,添加以下install命令:
# 安装include目录下所有头文件,保留目录结构 install(DIRECTORY src/include/ DESTINATION ${CMAKE_INSTALL_PREFIX}/include FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp")
配合问题2中的CMAKE_INSTALL_PREFIX配置,头文件会被复制到项目A的include目录。
方式二:通过ExternalProject_Add自定义安装(无需修改L)
如果L本身没有配置install规则,可在ExternalProject_Add中自定义INSTALL_COMMAND,手动复制头文件:
ExternalProject_Add( libL SOURCE_DIR ${CMAKE_SOURCE_DIR}/third_party/L BINARY_DIR ${CMAKE_BINARY_DIR}/libL-build CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release # 自定义安装逻辑:复制静态库和头文件到指定目录 INSTALL_COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:L> ${CMAKE_SOURCE_DIR}/lib/ && ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/third_party/L/src/include ${CMAKE_SOURCE_DIR}/include/ )
注意:这里假设L编译生成的目标名为L,如果实际名称不同,需要替换$<TARGET_FILE:L>中的目标名。
内容的提问来源于stack exchange,提问作者Sandm4n
相关产品推荐
相关产品推荐

