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


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

猜你喜欢

转载自blog.csdn.net/qq_26849933/article/details/127131908