【问题标题】:CMake remove include directoryCMake删除包含目录
【发布时间】:2014-06-04 07:06:23
【问题描述】:

一旦在 CMake 中找到包含目录,有什么方法可以删除。我发现了类似的问题here。但是答案对我来说没有多大意义。

我需要与上述消息的作者几乎完全相同。我有一个全局 CMakeLists.txt 文件,可以找到所有必需的包含路径。但是在一个特定子模块的 CMakeLists.txt 文件中,我想“隐藏”或“删除”系统包含路径并提供替代包含路径。

是的,一个解决方案可能只是简单地更改提到的子模块中的包含,但是这个子模块是来自其他存储库的外部库,所以我不想更改它的代码。

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    如果您有能力使用更新的 CMake 版本(2.8.11 或更高版本),请选择 target_include_directories 而不是 include_directories,您的大部分问题应该会立即消失。

    问题在于旧的include_directories 对目录属性起作用,只有当硬盘上文件的物理布局与不同子项目中代码的逻辑组织完全匹配时才会起作用。对于更复杂的代码库,这通常很难实现,并会导致像您描述的那样的问题。新的target_include_directories 改为适用于目标属性,这意味着文件的包含目录列表由它所属的子项目决定。这通常是考虑此类构建选项的更自然的方式。

    如果您卡在较旧的 CMake 版本,或者由于其他原因必须使用 include_directories(可能是这种情况,如果问题是您无法更改的外部库),您可以尝试 @987654323 @ 使用 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})
    

    【讨论】:

    • 在基于target 的替代方案可用时,所有这些全局函数都应该被弃用......
    • 你的意思可能是string(REPLACE ${what_needs_to_go} "" new_include_dirs ${the_include_dirs})。
    • @Lindydancer 你当然是对的。感谢您指出。
    • 使用 list(REMOVE_ITEM) 从列表中删除多个项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2012-06-14
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多