我在源树中有一个名为“time.h”的文件,与系统“time.h”完全相同。这不能改变。我遇到过cmake的问题,当我使用include_library选项时,它被转换为-I标志,这意味着我的自定义“time.h”优先于系统time.h,即使对于<>包括。这是一个定义禁忌。
我尝试使用include_directories(AFTER dir1 dir2)但它仍然生成-I选项而不是预期的-idirafter。
答案 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”文件。