当前位置: 首页 > java >正文

CMake link_directories()详细介绍与使用指南

1. link_directories() 是什么

link_directories() 是 CMake 中的一个目录搜索路径设置命令,它告诉 CMake 在链接阶段(link stage)去哪些目录查找库文件(.lib.a.so.dylib等)。

它会在 当前 CMake 目录作用域 下生效(从调用它的 CMakeLists.txt 开始,影响该作用域以及子目录)。


2. 语法

link_directories(directory1 [directory2 ...][BEFORE])
  • directory1 directory2 ...
    这是你存放静态库或动态库文件的文件夹路径,通常是绝对路径或相对路径(相对于当前 CMakeLists.txt 所在目录)。

  • BEFORE
    把新路径放到当前搜索目录列表的最前面(优先搜索)。缺省是放到后面。

📌 注意
CMake 的 link_directories() 会影响之后所有的 target_link_libraries() 去查找库文件的路径。


3. 基本用法示例

假设目录结构如下:

project_root/CMakeLists.txtsrc/CMakeLists.txtmain.cpplib/mylib.lib   (Windows)libmylib.a  (Linux/macOS)

根目录的 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(LinkDirExample)# 添加子目录
add_subdirectory(src)

src/CMakeLists.txt

add_executable(demo main.cpp)# 添加库目录
link_directories(${CMAKE_SOURCE_DIR}/lib)# 链接库
target_link_libraries(demo mylib)  # CMake 会在 lib/ 下查找 libmylib.a 或 mylib.lib

4. BEFORE 用法

如果你想覆盖系统库,或者优先用你自己编译的版本:

link_directories(BEFORE ${CMAKE_SOURCE_DIR}/custom_lib)

这样,custom_lib 会在 CMake 的链接库搜索路径中排到最前面。


5. 注意事项

  1. 全局性与不可控性
    link_directories() 修改的是“目录”搜索路径,对之后的所有 target 都会生效,很可能导致不必要的污染或冲突。

  2. 不会指定库名
    它只是告诉编译器去哪里找库,并不指定链接哪个库。实际链接要用:

    target_link_libraries(my_target libname)
    

    注意不要把路径放在 target_link_libraries() 里(那是另一种方法)。

  3. 顺序很重要
    先调用 link_directories(),再调用 target_link_libraries(),否则不会生效。

  4. 跨平台差异

    • Windows 一般库是 .lib / .dll(dll 不直接链接,还是使用 .lib 导入库)。
    • macOS 是 .dylib / .a
    • Linux 是 .so / .a
  5. CMake 现代用法不推荐
    官方建议使用 基于 target 的函数(见下一节)代替 link_directories()


6. 现代 CMake 推荐替代方案

不使用 link_directories(),直接为 target 指定库的完整路径或使用 target_link_directories()(CMake 3.13+):

target_link_directories()

add_executable(demo main.cpp)target_link_directories(demo PRIVATE ${CMAKE_SOURCE_DIR}/lib)target_link_libraries(demo PRIVATE mylib)

这样不会影响其它 target,作用域更清晰。

直接写库的完整路径

target_link_libraries(demo PRIVATE ${CMAKE_SOURCE_DIR}/lib/libmylib.a)

配合 find_library()

find_library(MYLIB NAMES mylib PATHS ${CMAKE_SOURCE_DIR}/lib)if(MYLIB)target_link_libraries(demo PRIVATE ${MYLIB})
endif()

这样跨平台和路径处理都更安全。


7. 完整示例

cmake_minimum_required(VERSION 3.10)
project(LinkDirExample)add_executable(demo main.cpp)# 不推荐(全局)
# link_directories(${CMAKE_SOURCE_DIR}/lib)# 推荐(局部作用域)
target_link_directories(demo PRIVATE ${CMAKE_SOURCE_DIR}/lib)# 链接库,名称不带前缀/扩展名
target_link_libraries(demo PRIVATE mylib)

8. 总结

方法优点缺点 / 风险
link_directories()语法简单,全局生效作用域太大、易污染、顺序依赖
target_link_directories()局部作用域、安全清晰需要 CMake >= 3.13
find_library() + 完整路径跨平台、文件检查、防止冲突写法稍长
直接完整路径不依赖搜索路径不够灵活

建议:在新项目中用 target_link_directories()find_library() + target_link_libraries()
仅在处理老项目或第三方代码时才用 link_directories() 以保持兼容。

http://www.xdnf.cn/news/18539.html

相关文章:

  • STM32F1 GPIO介绍及应用
  • C/C++三方库移植到HarmonyOS平台详细教程(补充版so库和头文件形式)
  • 凌霄飞控开发日志兼新手教程——基础篇:认识基本的文件内容和相关函数作用(25电赛备赛版)
  • 【序列晋升】12 Spring Boot 约定优于配置
  • Spring发布订阅模式详解
  • Python 调用 sora_image模型 API 实现图片生成与垫图
  • 【论文】Zotero文献管理
  • 为什么应用会突然耗尽所有数据库连接
  • 轮廓检测技术不仅能精确计算图像中的轮廓数量,还能完整记录每个轮廓包含的所有像素点坐标
  • 【0基础3ds Max】捕捉工具详解
  • 宋红康 JVM 笔记 Day06|虚拟机栈
  • [激光原理与应用-318]:结构设计 - Solidworks - 草图
  • 损耗源:导线电阻与趋肤效应
  • 深度学习②【优化算法(重点!)、数据获取与模型训练全解析】
  • 线上日志排查问题
  • MCP 与 Function Calling 打开真实世界的两种“母体”方式
  • Spring 框架深度解析:从核心原理到实战应用
  • GitLab CI :深入剖析 gl-sbom-report.cdx.json 解码“数字身份证”
  • linux下的网络编程
  • 快速入门Vue3——初体验
  • 6020角度双环控制一种用于电机控制的策略
  • 智能合约漏洞检测技术综述:守护区块链世界的“自动售货机”
  • 在通义灵码中配置MCP服务
  • uniapp使用map打包app后自定义气泡不显示解决方法customCallout
  • JavaWeb前端05(Vue工程化,Vue组件两种风格:组合式API 和 选项式API)及简单案例)
  • 豆包 + 蘑兔,破解写歌难题!
  • 知识蒸馏 Knowledge Distillation 论文 Generalized Knowledge Distillation (GKD) 目标函数的演化
  • 【Cmake】Cmake概览
  • 使用GMail API 发送邮箱
  • OpenSCA开源社区每日安全漏洞及投毒情报资讯|21th Aug. , 2025