我不认为这是CMake的问题;无论在#include
中是否使用引号或括号,也不管include_directories
中的各种选项如何,我相信gcc总是会在系统之前找到您的“time.h”。见的的CMake的include_directories
仅涉及如在海湾合作委员会的命令列出的目录顺序gcc documentation
的AFTER
选项-I
和-isystem
的条目,它不涉及到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。 – Boris 2012-03-28 05:50:01
我来到这个问题,因为我在我的包含搜索路径中无意中创建了一个名为“new”的空本地文件。这抢占了系统头文件,它被我使用的库使用了几个#include级别。我花了好几个小时弄清楚为什么(消息是**错误:'nothrow'不是'std'**之后编译器崩溃的成员。 似乎我可以使用-iquote机制(是否有Visual Studio等效?)以确保通过尖括号包含的文件仅来自系统标题;如果通过CMake命令支持它将会很好。 –
2013-09-29 03:50:49
有没有人知道是否有像Visual Studio中的iquote(cl.exe标志?) – 2013-10-25 21:48:23