【问题标题】:cmake include_directories order AFTER/BEFOREcmake include_directories 之后/之前的顺序
【发布时间】:2012-03-27 22:29:52
【问题描述】:

我在源代码树中有一个名为“time.h”的文件,与系统“time.h”完全相同。这是无法改变的。我在使用 cmake 时遇到了一个问题,即当我使用 include_library 选项时,它会被转换为 -I 标志,这意味着我的自定义“time.h”即使对于 包含也会优先于系统 time.h。这是一个明确的禁忌。

我尝试使用 include_directories(在 dir1 dir2 之后),但它仍然生成 -I 选项而不是预期的 -idirafter。

【问题讨论】:

    标签: linux gcc cmake include-path


    【解决方案1】:

    我认为这不是 CMake 的问题;我相信 gcc 将始终在系统之一之前找到您的“time.h”,无论您是否在#include 中使用引号或括号,也无论include_directories 中的各种选项如何。在gcc documentation 中查看-I-isystem 的条目

    CMake 的 include_directoriesAFTER 选项仅与 gcc 命令中列出的目录顺序有关,与 gcc 的 -idirafter 标志无关。

    让您自己的文件与系统文件同名并不是一个好计划,但如果您束手无策,您可以通过更完整地限定您自己包含的路径来避免此问题而无需重命名 time.h,因此比例如

    CMakeLists.txt:  include_directories(${PROJECT_SOURCE_DIR}/src)
    
    header file:     #include <time.h>  // we want but don't get system one
                     #include "time.h"  // we want and get own custom one
    

    有点像

    CMakeLists.txt:  include_directories(${PROJECT_SOURCE_DIR})
    
    header file:     #include <time.h>      // we want and get system one
                     #include "src/time.h"  // we want and get own custom one
    


    另一种选择是坚持使用您当前的#include 设置(使用尖括号作为系统time.h 并为您自己使用引号),并且在CMakeLists.txt 中根本不使用include_directories。相反,我认为您可以将其替换为:

    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -iquote ${PROJECT_SOURCE_DIR}/src")
    

    使用-iquote 可能是比-idirafter 更好的选择,因为-idirafter 指定的目录(在这种情况下不正确)被视为系统目录,因此会抑制警告等。

    如果您确实选择了这个选项,可能值得评论 CMakeLists.txt 以解释为什么没有 include_directories 以避免将来重构恢复使用更正常的 include_directories 命令。

    总而言之,如果可能的话,您最好的选择是重命名您的“time.h”文件。

    【讨论】:

    • 非常感谢您的完整回答。第一个选项对我不利,因为问题不在于我的文件,而在于像“sched.h”这样的系统文件,它错误地包含了我的文件而不是系统文件。因此,我可能会使用显式编译器选项而不是使用 include_directories。
    • 我来这个问题是因为我无意中在我的包含搜索路径中创建了一个名为“new”的空本地文件。这抢占了 系统标头,我正在使用的库在几个 #include 级别之外使用了该标头。我花了几个小时找出原因(消息是 error: ‘nothrow’ is not a member of ‘std’,然后是编译器崩溃)。似乎我可以使用 -iquote 机制(是否有等效的 Visual Studio?)来确保通过尖括号包含的文件仅来自系统头文件;如果通过 CMake 命令支持,那就太好了。
    • 有谁知道Visual Studio中是否有类似iquote的东西(cl.exe标志?)
    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多