cmake中如何从include_directories中移除某个特定的头文件

目录

[方法 1:手动重新设置 CMAKE_INCLUDE_PATH](#方法 1:手动重新设置 CMAKE_INCLUDE_PATH)

解释:

[方法 2:使用变量存储并过滤路径](#方法 2:使用变量存储并过滤路径)

示例:

解释:

[方法 3:直接操作全局变量 CMAKE_INCLUDE_PATH](#方法 3:直接操作全局变量 CMAKE_INCLUDE_PATH)

示例:

注意:

[方法 4:使用目标范围的 target_include_directories](#方法 4:使用目标范围的 target_include_directories)

示例:

解释:

总结


在 CMake 中,include_directories() 是用来添加头文件搜索路径的,但它并没有提供直接移除某个特定路径的功能。如果需要从 include_directories() 中移除某个特定的路径,可以通过以下方法间接实现:


方法 1:手动重新设置 CMAKE_INCLUDE_PATH

CMake 并不会自动提供移除路径的功能,因此你可以通过重新设置 include_directories() 来覆盖之前的设置。

例如,如果你想从 include_directories() 中移除路径 /path/to/remove,可以这样操作:

复制代码
# 假设已有的 include_directories
include_directories(/path/to/include /path/to/remove /path/to/another)

# 手动移除 /path/to/remove
set(INCLUDE_DIRS /path/to/include /path/to/another)
include_directories(${INCLUDE_DIRS})

解释:

  1. 通过重新定义 INCLUDE_DIRS 变量,手动排除不需要的路径。
  2. 再次调用 include_directories(${INCLUDE_DIRS}),覆盖之前的设置。

方法 2:使用变量存储并过滤路径

如果你是动态地添加路径,并希望更灵活地移除某个路径,可以使用 list(FILTER) 或手动操作列表。

示例:

复制代码
# 假设已有的 include 路径存储在变量中
set(INCLUDE_DIRS /path/to/include /path/to/remove /path/to/another)

# 移除 /path/to/remove
list(FILTER INCLUDE_DIRS EXCLUDE REGEX "/path/to/remove")

# 重新设置 include_directories
include_directories(${INCLUDE_DIRS})

解释:

  1. list(FILTER ...) 是 CMake 中用于操作列表的命令。
  2. EXCLUDE REGEX 表示移除与正则表达式匹配的路径。

方法 3:直接操作全局变量 CMAKE_INCLUDE_PATH

CMake 中的 CMAKE_INCLUDE_PATH 是一个全局变量,存储了所有的头文件搜索路径。虽然不推荐直接操作全局变量,但在某些情况下可以使用。

示例:

复制代码
# 假设你已经添加了多个 include 路径
include_directories(/path/to/include /path/to/remove /path/to/another)

# 手动移除路径
string(REPLACE "/path/to/remove" "" CMAKE_INCLUDE_PATH "${CMAKE_INCLUDE_PATH}")

注意:

  1. 这种方法直接操作全局变量,可能会影响其他部分的构建。
  2. 不推荐直接修改 CMAKE_INCLUDE_PATH,除非你非常清楚其影响范围。

方法 4:使用目标范围的 target_include_directories

如果你使用的是 target_include_directories() 而不是全局的 include_directories(),可以更轻松地控制头文件路径。

示例:

复制代码
# 添加路径到某个目标
target_include_directories(my_target PRIVATE /path/to/include /path/to/remove /path/to/another)

# 手动重新设置,移除 /path/to/remove
set(INCLUDE_DIRS /path/to/include /path/to/another)
target_include_directories(my_target PRIVATE ${INCLUDE_DIRS})

解释:

  1. target_include_directories() 允许你为特定目标设置头文件路径,而不是全局生效。
  2. 重新设置路径时,只需覆盖之前的设置即可。

总结

CMake 并没有直接提供从 include_directories() 中移除路径的功能,但可以通过以下方式实现:

  1. 手动重新定义路径 :重新设置 include_directories(),排除不需要的路径。
  2. 使用 list(FILTER) 操作列表:动态移除不需要的路径。
  3. 直接操作全局变量 :修改 CMAKE_INCLUDE_PATH(不推荐)。
  4. 使用目标范围的 target_include_directories:为特定目标设置路径,避免全局污染。

推荐使用 方法 2(列表操作)方法 4(目标范围设置),它们更灵活且更符合现代 CMake 的实践。

相关推荐
研究点啥好呢2 小时前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
_dindong2 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
沫璃染墨2 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
计算机安禾3 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
unicrom_深圳市由你创科技3 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
无限进步_4 小时前
【C++】电话号码的字母组合:从有限处理到通用解法
开发语言·c++·ide·windows·git·github·visual studio
C++ 老炮儿的技术栈4 小时前
GCC编译时无法向/tmp 目录写入临时汇编文件,因为设备空间不足,解决
linux·运维·开发语言·汇编·c++·git·qt
橘颂TA4 小时前
【笔试】算法的暴力美学——牛客 NC213140 :除2!
c++·算法·结构与算法
wsoz5 小时前
Leetcode普通数组-day5、6
c++·算法·leetcode·数组