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