You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:09:01