2012-03-27 67 views
2

我在源码树中有一个名为“time.h”的文件,正如系统“time.h”一样。这不能改变。我遇到了cmake的一个问题,那就是当我使用include_library选项时,它被转换为-I标志,这意味着我的自定义“time.h”会优先于系统时间h,即使对于<> include也是如此。这是一个定义不。cmake include_directories命令AFTER /之前

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

回答

3

我不认为这是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”文件。

+0

非常感谢您的完整答案。第一种选择对我来说不好,因为问题不在于我的文件,而在于像“sched.h”这样的系统文件,它错误地包含了我的文件而不是系统文件。所以可能,我将使用显式编译器选项而不是使用include_directories。 – Boris 2012-03-28 05:50:01

+0

我来到这个问题,因为我在我的包含搜索路径中无意中创建了一个名为“new”的空本地文件。这抢占了系统头文件,它被我使用的库使用了几个#include级别。我花了好几个小时弄清楚为什么(消息是**错误:'nothrow'不是'std'**之后编译器崩溃的成员。 似乎我可以使用-iquote机制(是否有Visual Studio等效?)以确保通过尖括号包含的文件仅来自系统标题;如果通过CMake命令支持它将会很好。 – 2013-09-29 03:50:49

+1

有没有人知道是否有像Visual Studio中的iquote(cl.exe标志?) – 2013-10-25 21:48:23