如何在CMake项目中添加非CMake构建的第三方依赖库?
配置非CMake构建的第三方库供CMake项目使用
当你需要将autotools等非CMake构建的库集成到CMake项目中,正确的做法是创建导入目标(IMPORTED Target),而不是用add_custom_target——后者是用来定义自定义构建流程的,无法承载库的头文件、链接路径等属性。下面是两种实用的配置方式:
方法一:手动创建导入目标(直接高效)
适合你已经明确知道库安装路径的场景,步骤如下:
定义导入目标
先声明一个静态/动态导入库目标(根据你的库类型选择STATIC或SHARED):add_library(foobar STATIC IMPORTED GLOBAL)GLOBAL关键字确保这个目标能在项目所有子目录中被引用。指定库文件路径
把安装好的库文件路径关联到目标上:set_target_properties(foobar PROPERTIES IMPORTED_LOCATION "$ENV{INSTALL}/lib/foobar.a" )这里用
$ENV{INSTALL}直接读取你设置的环境变量,也可以替换成固定路径或CMake变量。关联头文件目录
设置头文件的包含路径,CMake会自动把这个路径传递给所有链接该目标的项目代码:set_target_properties(foobar PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "$ENV{INSTALL}/include" )在项目中使用
之后你就可以像使用CMake原生构建的库一样,直接通过target_link_libraries链接:target_link_libraries(你的项目目标 PRIVATE foobar)
方法二:编写Find模块(灵活可扩展)
如果需要让CMake自动查找库(比如支持不同安装路径),可以编写自定义Find模块:
创建Find模块文件
在项目根目录下新建cmake/modules/FindFoobar.cmake,内容如下:# 查找头文件 find_path(FOOBAR_INCLUDE_DIR NAMES foobar.h PATHS "$ENV{INSTALL}/include" NO_DEFAULT_PATH ) # 查找库文件 find_library(FOOBAR_LIBRARY NAMES foobar PATHS "$ENV{INSTALL}/lib" NO_DEFAULT_PATH ) # 检查是否找到 include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Foobar DEFAULT_MSG FOOBAR_INCLUDE_DIR FOOBAR_LIBRARY ) # 如果找到,创建导入目标 if(FOOBAR_FOUND) add_library(foobar STATIC IMPORTED GLOBAL) set_target_properties(foobar PROPERTIES IMPORTED_LOCATION "${FOOBAR_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${FOOBAR_INCLUDE_DIR}" ) endif()在主CMakeLists.txt中引用模块
把模块目录加入CMake的模块搜索路径,然后查找库:list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") find_package(Foobar REQUIRED)使用方式和方法一完全相同
同样通过target_link_libraries(你的项目目标 PRIVATE foobar)链接库。
内容的提问来源于stack exchange,提问作者Alexey Ismagilov
相关产品推荐
相关产品推荐

