CMake常用命令(七)include_directories和target_include_directories命令

本文介绍了CMake中两种管理头文件搜索路径的方法:include_directories与target_include_directories的区别和使用建议。前者作用于整个CMakeLists.txt文件,后者针对特定目标。文章通过实例展示了如何灵活地使用这些命令来组织项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


include_directories

语法

include_directories ([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

作用

将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。

参数

默认情况下,include_directories命令会将目录添加到列表最后,可以通过命令设置CMAKE_INCLUDE_DIRECTORIES_BEFORE变量为ON来改变它默认行为,将目录添加到列表前面。也可以在每次调用include_directories命令时使用AFTERBEFORE选项来指定是添加到列表的前面或者后面。如果使用SYSTEM选项,会把指定目录当成系统的搜索目录。该命令作用范围只在当前的CMakeLists.txt。

举例

假设当前系统的cmake版本为3.10.2

cmake_minimum_required(VERSION 3.18.2)
project(include_directories_test)

include_directories(sub) 
include_directories(sub2) #默认将sub2添加到列表最后
include_directories(BEFORE sub3) #可以临时改变行为,添加到列表最前面

get_property(dirs DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
message(">>> include_dirs=${dirs}") #打印一下目录情况

set(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON) #改变默认行为,默认添加到列表前面
include_directories(sub4)
include_directories(AFTER sub5) #可以临时改变行为,添加到列表的最后
get_property(dirs DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
message(">>> SET DEFAULT TO BEFORE, include_dirs=${dirs}")

输出为:

>>> include_dirs=/XXX/XXX/sub3;/XXX/XXX/sub;/XXX/XXX/sub2
>>> SET DEFAULT TO BEFORE, include_dirs=/XXX/XXX/sub4;/XXX/XXX/sub3;/XXX/XXX/sub;/XXX/XXX/sub2;/XXX/XXX/sub5

target_include_directories

语法

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

作用

该命令可以指定目标(exe或者so文件)需要包含的头文件路径,命名为 < target > 的命令必须是由 add _ Executive ()或 add _ library ()之类的命令创建的,并且不能是 ALIAS 目标。

参数

  • PUBLIC:对内对外都公开,可将头文件目录以及链接库传递给连接者,target对应的头文件、源文件都使用。
  • PRIVATE:对内公开,对外不公开,不可传递头文件目录以及链接库,target对应的源文件使用。
  • INTERFACE:对外公开,对内不公开,可传递头文件目录以及链接库,但内部不可使用头文件及连接库,只能接口传递,target对应的头文件使用。

两者的区别

include_directories:

当前CMakeLists.txt的所有目标,以及之后添加的所有子目录的目标添加头文件搜索路径。因此,慎用include_directories,因为会影响全局target。

target_include_directories:

指定目标包含的头文件路径。如果想为不同目标设置不同的搜索路径,那么用target_include_directories更合适。

使用建议

target_include_directories() 的功能完全可以使用 include_directories() 实现。但是我还是建议使用 target_include_directories()。为什么?保持清晰!

include_directories(header-dir) 是一个全局包含,向下传递。什么意思呢?就是说如果某个目录的 CMakeLists.txt 中使用了该指令,其下所有的子目录默认也包含了header-dir 目录。

参考

Cmake命令之include_directories介绍
官方文档include_directories
官方文档target_include_directories
include_directories和target_include_directories
cmake:target_** 中的 PUBLIC,PRIVATE,INTERFACE

CMake中,`include_directories` `target_include_directories` 都用于指定头文件的搜索路径,但它们的使用方式适用范围有所不同。 1. `include_directories`: - 这是一个全局命令,会将指定的目录添加到所有后续的编译任务中。 - 它的语法如下: ```cmake include_directories(directory1 directory2 ...) ``` - 例如: ```cmake include_directories(/usr/include/myproject) ``` - 这种方式适用于简单的项目,但对于大型项目或需要更精细控制的项目来说,可能不够灵活。 2. `target_include_directories`: - 这是一个针对特定目标的命令,会将指定的目录添加到指定的目标中。 - 它的语法如下: ```cmake target_include_directories(target PUBLIC|PRIVATE|INTERFACE directory1 directory2 ...) ``` - 例如: ```cmake target_include_directories(MyApp PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) ``` - 这种方式更灵活,可以为不同的目标指定不同的包含目录,并且可以通过PUBLIC、PRIVATEINTERFACE关键字来控制包含目录的可见性。 - PUBLIC:包含目录会被添加到目标及其依赖项中。 - PRIVATE:包含目录只会被添加到目标中,不会传递给依赖项。 - INTERFACE:包含目录只会被添加到依赖项中,不会添加到目标中。 总结: - `include_directories` 适用于简单的项目,使用简单但不够灵活。 - `target_include_directories` 适用于复杂的项目,提供更精细的控制更高的灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值