CMake如何链接第三方库?附对应项目层级目录结构说明
CMake 引入本地预编译第三方库适配方案
首先在项目根目录(top-Level)下新建CMakeLists.txt,按以下步骤配置:
1 基础配置与第三方库根路径定义
首先写入基础CMake声明,同时定义第三方库根目录变量方便后续复用:
cmake_minimum_required(VERSION 3.15) # 按需调整最低支持版本 project(YourProjectName) # 替换为你的项目名 # 定义第三方库根目录,CMAKE_SOURCE_DIR是顶层CMake所在目录 set(THIRD_PARTY_ROOT ${CMAKE_SOURCE_DIR}/ThirdLib)
2 导入Lib1、Lib2为CMake可识别的导入目标
分别为两个预编译库配置导入属性,CMake会自动关联头文件、库文件路径:
# 导入Lib1 add_library(Lib1 SHARED IMPORTED) # 配置Lib1的公开头文件路径,关联后链接该库的目标会自动引入该头文件目录 set_target_properties(Lib1 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${THIRD_PARTY_ROOT}/Lib1/Include IMPORTED_IMPLIB ${THIRD_PARTY_ROOT}/Lib1/LIB/Lib1.lib # 替换为实际的lib文件名 IMPORTED_LOCATION ${THIRD_PARTY_ROOT}/Lib1/DLL/Lib1.dll # 替换为实际的dll文件名 ) # 导入Lib2,配置逻辑和Lib1完全一致 add_library(Lib2 SHARED IMPORTED) set_target_properties(Lib2 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${THIRD_PARTY_ROOT}/Lib2/Include IMPORTED_IMPLIB ${THIRD_PARTY_ROOT}/Lib2/LIB/Lib2.lib # 替换为实际的lib文件名 IMPORTED_LOCATION ${THIRD_PARTY_ROOT}/Lib2/DLL/Lib2.dll # 替换为实际的dll文件名 )
如果你的库分Debug、Release版本,可分别配置对应属性:
# 示例:Lib1的Debug版本配置 set_target_properties(Lib1 PROPERTIES IMPORTED_IMPLIB_DEBUG ${THIRD_PARTY_ROOT}/Lib1/LIB/Lib1_d.lib IMPORTED_LOCATION_DEBUG ${THIRD_PARTY_ROOT}/Lib1/DLL/Lib1_d.dll IMPORTED_IMPLIB_RELEASE ${THIRD_PARTY_ROOT}/Lib1/LIB/Lib1.lib IMPORTED_LOCATION_RELEASE ${THIRD_PARTY_ROOT}/Lib1/DLL/Lib1.dll )
3 配置UseThirdLib模块
进入UseThirdLib目录,新建该模块的CMakeLists.txt,按你的模块类型配置:
# 如果是生成可执行程序,用add_executable,按需补充你的源文件 add_executable(UseThirdLib test.h test.cpp) # 如果是生成库文件,用add_library即可 # add_library(UseThirdLib test.h test.cpp) # 关联第三方库,PRIVATE表示仅当前模块依赖,PUBLIC表示依赖该模块的其他目标也需要继承这两个依赖 target_link_libraries(UseThirdLib PRIVATE Lib1 Lib2) # 可选配置:编译完成后自动将第三方库DLL拷贝到程序输出目录,避免运行时找不到DLL add_custom_command(TARGET UseThirdLib POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Lib1> $<TARGET_FILE:Lib2> $<TARGET_FILE_DIR:UseThirdLib> )
最后回到顶层CMakeLists.txt末尾,添加子模块声明:
add_subdirectory(UseThirdLib)
配置注意事项
- 如果是Linux平台,没有导入库(.lib)的概念,直接删除
IMPORTED_IMPLIB相关配置,IMPORTED_LOCATION对应.so文件路径即可 - 如果你的
test.h中直接引用了Lib1/Lib2的头文件,需要将target_link_libraries中的PRIVATE改为PUBLIC,保证其他依赖UseThirdLib的模块也能找到对应的头文件 - 注意库的位数(32位/64位)、运行时库版本要和你的项目配置保持一致,避免链接报错
内容的提问来源于stack exchange,提问作者Savner_Dig
相关产品推荐
相关产品推荐

