cmake include_directories命令AFTER / BEFORE

时间:2012-03-27 22:29:53

标签: linux gcc cmake include-path

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

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

1 个答案:

答案 0 :(得分:3)

我不认为这是CMake的问题;我相信gcc总会在系统之前找到你的“time.h”,无论你在#include中使用引号或括号,而不管include_directories中的各种选项。请参阅gcc documentation

-I-isystem的条目

CMake AFTER的{​​{1}}选项仅与gcc命令中列出的目录顺序有关,它与gcc的include_directories标志无关。

让你自己的文件与系统文件具有相同的名称并不是一个好计划,但是如果你的手被束缚,你可以避免这个问题而不用重命名time.h,通过更充分地限定你自己的包含路径,所以相反比如

-idirafter

更像是

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 设置(使用系统time.h的尖括号和自己的引号),而不是在CMakeLists.txt中使用#include。相反,我认为你可以用以下内容替换它:

include_directories

使用set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -iquote ${PROJECT_SOURCE_DIR}/src") 可能是比-iquote更好的选择,因为-idirafter指定的目录(在这种情况下不正确)被视为系统目录,因此警告被抑制,等

如果您选择这样做,可能值得对CMakeLists.txt进行评论,以解释为什么没有-idirafter以避免将来的重构恢复使用更正常的include_directories命令。

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