gpt4 book ai didi

linux - cmake include_directories 命令之后/之前

转载 作者:太空狗 更新时间:2023-10-29 12:06:31 26 4
gpt4 key购买 nike

我在源代码树中有一个名为“time.h”的文件,与系统“time.h”完全一样。这是无法更改的。我遇到了 cmake 的问题,当我使用 include_library 选项时,它被转换为 -I 标志,这意味着我的自定义“time.h”优先于系统 time.h,即使对于 <> 包含也是如此。这是一个明确的禁忌。

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

最佳答案

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

CMake 的 include_directoriesAFTER 选项仅与 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 设置(使用系统时间的尖括号。h 和您自己的引号)并且根本不使用 include_directories CMakeLists.txt。相反,我认为您可以将其替换为:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -iquote ${PROJECT_SOURCE_DIR}/src")

使用 -iquote 可能是比 -idirafter 更好的选择,因为 -idirafter 指定的目录被(在这种情况下不正确地)处理作为系统目录,因此抑制了警告等。

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

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

关于linux - cmake include_directories 命令之后/之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9898643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com