include_directories 、 link_directories 、link_libraries之间区别

在使用 CMake 构建项目时,管理路径和链接库是非常重要的。CMake 提供了多个命令来设置头文件路径、库文件路径及链接库。其中,include_directorieslink_directorieslink_libraries 是最常用的三个命令。它们的作用分别是:设置头文件搜索路径、设置库文件搜索路径以及指定需要链接的库文件。


1. include_directories

功能

include_directories 用于指定编译阶段头文件的搜索路径。

用法

include_directories(path1 path2 ...)

  • 作用阶段:编译阶段。
  • 作用对象:头文件(如 .h.hpp)。
  • 作用范围:默认全局,影响当前 CMakeLists.txt 文件中所有的目标。
影响

告诉编译器在查找 #include 的头文件时,除了默认路径,还可以从指定路径中查找。

示例

include_directories(${CMAKE_SOURCE_DIR}/include)

add_executable(my_target main.cpp)

在上述示例中,main.cpp 可以通过 #include 使用 ${CMAKE_SOURCE_DIR}/include 下的头文件。

现代替代方案

在现代 CMake 中,推荐使用目标作用域的 target_include_directories,以精确控制头文件路径的作用范围。

target_include_directories(my_target PUBLIC ${CMAKE_SOURCE_DIR}/include)


2. link_directories

功能

link_directories 用于指定链接阶段库文件的搜索路径。

用法

link_directories(directory1 directory2 ...)

  • 作用阶段:链接阶段。
  • 作用对象:库文件(如 .so.a.lib 等)。
  • 作用范围:全局,影响当前 CMakeLists.txt 文件中所有的目标。
影响

告诉链接器在查找目标库文件时,除了默认路径,还可以从指定路径中查找。

示例

link_directories(${CMAKE_SOURCE_DIR}/libs)

add_executable(my_target main.cpp)

target_link_libraries(my_target my_library)

在上述示例中,链接器会在 ${CMAKE_SOURCE_DIR}/libs 中查找名为 my_library 的库文件。

注意事项
  • 仅指定库的搜索路径,并不会直接将库文件链接到目标。
  • 如果可能,优先使用绝对路径或通过 find_package 指定库。
现代替代方案

建议直接在 target_link_libraries 中使用库的完整路径,避免使用 link_directories


3. link_libraries

功能

link_libraries 用于指定全局或局部范围的链接库。

用法

link_libraries(library1 library2 ...)

  • 作用阶段:链接阶段。
  • 作用对象:库文件(如 .so.a.lib 等)。
  • 作用范围
    • 全局:直接使用 link_libraries,会影响当前 CMakeLists.txt 中定义的所有目标。
    • 局部:通过作用域关键字限制作用范围(例如 PUBLICPRIVATE)。
影响

在链接目标时,自动添加指定的库文件。

示例

link_libraries(my_library)

add_executable(target1 main.cpp)

add_executable(target2 other.cpp)

上述代码中,my_library 会被自动添加到 target1target2 的链接阶段。

局部范围控制

可以通过作用域关键字限制库的作用范围:

link_libraries(PUBLIC my_library)

现代替代方案

现代 CMake 更推荐直接使用 target_link_libraries,为目标精确设置所需的库。

target_link_libraries(my_target PRIVATE my_library)


三者的区别

命令作用作用阶段作用范围现代替代方案
include_directories指定头文件搜索路径编译阶段默认全局target_include_directories
link_directories指定库文件搜索路径链接阶段默认全局避免使用,直接指定完整路径
link_libraries为所有后续目标指定链接库链接阶段默认全局或局部作用域target_link_libraries

如何选择正确的命令?

  1. 优先使用目标作用域命令

    • 如果仅需对单个目标进行设置,直接使用 target_include_directoriestarget_link_libraries
    • 避免全局命令(如 link_librariesinclude_directories),以减少潜在的冲突。
  2. 尽量避免使用 link_directories

    • 在现代 CMake 中,直接通过 target_link_libraries 指定库的完整路径更安全。
    • 如果必须使用,请确保路径唯一并清晰。
  3. 控制依赖传播

    • 通过 PRIVATEPUBLICINTERFACE 等关键字明确依赖的传播规则。

示例:完整的现代 CMake 使用方式

cmake_minimum_required(VERSION 3.20)
project(MyProject)# 指定头文件和库的路径
set(MY_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include)
set(MY_LIBRARY_DIR ${CMAKE_SOURCE_DIR}/libs)
set(MY_LIBRARY my_library)# 定义目标
add_executable(my_target main.cpp)# 为目标设置头文件路径
target_include_directories(my_target PRIVATE ${MY_INCLUDE_DIR})# 直接设置库文件
target_link_libraries(my_target PRIVATE ${MY_LIBRARY_DIR}/${MY_LIBRARY})

总结

  • include_directories 用于头文件路径,link_directories 用于库文件路径,而 link_libraries 用于全局设置链接库。
  • 在现代 CMake 中,更推荐使用目标作用域的命令如 target_include_directoriestarget_link_libraries
  • 避免全局命令可以提高配置的可维护性和可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18750.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】虚拟地址空间,页表,物理内存

目录 进程地址空间,页表,物理内存 什么叫作地址空间? 如何理解地址空间的区域划分? 地址空间结构体 为什么要有地址空间? 页表 cr3寄存器 权限标记位 位置标记位 其他 每个存储单元是一个字节,一…

集群聊天服务器(3)muduo网络库

目录 基于muduo的客户端服务器编程 muduo只能装在linux中,依赖boost库 客户端并不需要高并发 基于muduo的客户端服务器编程 支持epoll线程池,muduo封装了线程池 而且还有完善的日志系统 使用muduo库代码非常固定,基本就只有chatserver的类名…

【Python刷题】最少拐弯路线问题

题目描述 洛谷P1649 一、题目理解 首先,我们来看一下这道题目的要求。题目给定了一个 NN(1≤N≤100) 的方格,方格中的每个格子有不同的状态,用 . 表示可以行走的格子,x 表示不能行走的格子,…

在windows系统里面部署 Redis

在windows中下载安装REdis 1.下载mis 地址添加链接描述 然后直接下载安装然后点击你的库 2.然后选择好之后选择好路径就行了。 然后我们点击这个cli.exe文件然后双击打开输入 在命令框里输入: 如果显示的和图片显示的一样,则证明你已经在本地部署好了…

NTP博客

使用nmtui命令修改IP: 注意: 修改之后,要激活: nmcli connection up ens160 1、软件安装 #设置当前时区 [rootlocalhost ~]# timedatectl set-timezone Asia/Shanghai 1.1.配置国内阿里yum源 [rootredhat ~]# cd /etc/yum.r…

《Large-scale Multi-modal Pre-trained Models: A Comprehensive Survey》中文校对版

文章汉化系列目录 文章目录 文章汉化系列目录摘要引言2 背景2.1 传统深度学习2.2 自然语言处理中的预训练2.3 计算机视觉中的预训练2.4 音频与语音中的预训练 3 多模态预训练3.1 任务定义与关键挑战3.2 MM-PTM的优势3.3 预训练数据3.4 预训练目标3.5 预训练网络架构3.5.1 自注意…

从源码角度分析JDK动态代理

文章目录 前言一、JDK动态代理二、动态代理的生成三、invoke的运行时调用总结 前言 本篇从源码的角度,对JDK动态代理的实现,工作原理做简要分析。 一、JDK动态代理 JDK动态代理是运行时动态代理的一种实现,相比较于CGLIB ,目标对象…

操作系统——计算机系统概述——1.5操作系统引导(开机过程)

操作系统引导: A.CPU从一个特定主存地址开始,取指令,执行ROM中的引导程序(先进行硬件自检,再开机) B.将磁盘的第一块——主引导记录读入内存,执行磁盘引导程序,扫描分区表 C.从活动分…

推荐一本python学习书:《编程不难》

推荐理由 全面:把零基础Python编程、可视化、数学、数据、机器学习,融合在一起,循循渐进。 开源:PDF、Python代码、Jupyter文档,在github直接免费下! 真实:提供大量真实场景下的数据&#xff…

数据结构与算法分析模拟试题及答案5

模拟试题(五) 一、单项选择题(每小题 2 分,共20分) (1)队列的特点是(   )。 A)先进后出 B)先进先出 C)任意位置进出 D&#xff0…

集群聊天服务器(9)一对一聊天功能

目录 一对一聊天离线消息服务器异常处理 一对一聊天 先新添一个消息码 在业务层增加该业务 没有绑定事件处理器的话消息会派发不出去 聊天其实是服务器做一个中转 现在同时登录两个账号 收到了聊天信息 再回复一下 离线消息 声明中提供接口和方法 张三对离线的李…

jedis基础入门

jedis采用key&#xff0c;value的形式保存数据&#xff0c;使用nosql sql和nosql的区别 一&#xff1a;入门案例 导入依赖 <dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>…

QWen2.5学习

配置环境 pip install transformers 记得更新一下&#xff1a;typing_extensions pip install --upgrade typing_extensions 安装modelscope modelscope/modelscope: ModelScope: bring the notion of Model-as-a-Service to life. 下载这个仓库的代码上传到服务器解压 推…

足球青训俱乐部管理后台系统(程序+数据库+报告)

基于SpringBoot的足球青训俱乐部管理后台系统&#xff0c;系统包含两种角色&#xff1a;管理员、用户,系统分为前台和后台两大模块 编程语言&#xff1a;Java 数据库&#xff1a;MySQL 项目管理工具&#xff1a;Maven 前端技术&#xff1a;Vue 后端技术&#xff1a;SpringBoot…

MoneyPrinterTurbo - AI自动生成高清短视频

MoneyPrinterTurbo是一款基于AI大模型的开源软件&#xff0c;旨在通过一键操作帮助用户自动生成高清短视频。只需提供一个视频 主题或 **关键词** &#xff0c;就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐&#xff0c;然后合成一个高清的短视频。 ​ ​ 主要…

Cross-Inlining Binary Function Similarity Detection

注&#xff1a;在阅读该论文时顺便参考了作者团队的分享视频&#xff1a;【ICSE 2024论文预讲会-第二期-下午-哔哩哔哩】 https://b23.tv/XUVAPy3 在这个视频的末尾最后一个 一.introducion 计算下面两个函数的相似度&#xff1a; 查询函数&#xff1a;脆弱函数&#xff0c;重…

C++:哈希拓展-位图

目录 一.问题导入 二.什么是位图? 2.1如何确定目标数在哪个比特位? 2.2如何存放高低位 2.3位图模拟代码实现 2.3.1如何标记一个数 2.3.2如何重置标记 2.3.3如何检查一个数是否被标记 整体代码实现 标准库的Bitset 库中的bitset的缺陷 简单应用 一.问题导入 这道…

GCP : Memcache backed by Cloud Datastore

Memcache backed by Cloud Datastore 的用途主要体现在以下几个方面&#xff1a; 提高性能和可扩展性&#xff1a; Memcache 是一个高性能的分布式内存对象缓存系统&#xff0c;通常用于缓存数据库查询等操作&#xff0c;以减轻数据库负载&#xff0c;加快动态Web应用的响应速度…

【Python】问题解决:yaml文件加载得到字符串而不是字典

问题描述 最近需要使用python处理yaml文件&#xff0c;但使用过程中发现只能输出字符串的格式&#xff0c;而不是想要的字典格式。 基本使用 在python中想要读写yaml文件&#xff0c;可以安装使用第三方包pyyaml来实现&#xff0c;首先安装一下&#xff1a; pip install pyya…

时钟之Canvas+JS版

写在前面 上一篇介绍使用CSSJS方式实现&#xff0c;但元素太过单一。此篇将以HTML5的canvas标签结合JS来实现。 HTML代码 <canvas id"clock" width"300" height"300"></canvas> JS代码 var canvas null; var ctx null; var int…