有没有办法在CMake中找到包含目录后删除。我发现了类似的问题here。但回答对我来说没有多大意义。
我需要与上述消息的作者几乎完全相同。我有一个全局CMakeLists.txt文件,它找到所有必要的包含路径。但是在一个特定子模块的CMakeLists.txt文件中,我想"隐藏"或"删除"系统包括路径并提供替代包括路径。
是的,一个解决方案可能只是简单地改变包含在提到的子模块中,但是这个子模块是来自其他存储库的外部库,所以我不想改变它的代码。
答案 0 :(得分:8)
如果您有能力使用较新的CMake版本(2.8.11或更高版本),请选择target_include_directories
而不是include_directories
,您的大多数问题都会立即消失。
问题在于旧的include_directories
适用于目录属性,只有当硬盘上的文件的物理布局与不同子项目中的逻辑组织结构完全匹配时,才能解决问题。对于更复杂的代码库,这通常很难实现,并导致像您描述的那样的问题。新的target_include_directories
代替目标属性,这意味着文件的包含目录列表由它所属的子项目决定。这通常是考虑这种构建选项的更自然的方式。
如果您遇到较旧的CMake版本,或者您必须使用include_directories
出于其他原因(这可能就是这种情况,如果问题是您无法更改的外部库),您可以尝试tinkering具有由include_directories
命令设置的INCLUDE_DIRECTORIES
目录属性,但是为一些小事做好准备:
get_property(the_include_dirs DIRECTORY foo PROPERTY INCLUDE_DIRECTORIES)
string(REPLACE ${what_needs_to_go} "" new_include_dirs ${the_include_dirs})
set_property(DIRECTORY foo PROPERTY INCLUDE_DIRECTORIES ${new_include_dirs})