使用 CMake 和 c++ 编译时,如果两个头文件名称相同,会发生啥情况?

Posted

技术标签:

【中文标题】使用 CMake 和 c++ 编译时,如果两个头文件名称相同,会发生啥情况?【英文标题】:What happens if two headers share the same name when compiling with CMake and c++?使用 CMake 和 c++ 编译时,如果两个头文件名称相同,会发生什么情况? 【发布时间】:2018-04-16 02:41:18 【问题描述】:

给定以下目录结构:

注意有两个文件名为System-Libraries.hpp

我目前包含的方式是:

#include "System-Libraries.hpp"

很明显,这里存在歧义。该项目编译并运行,因此系统目前似乎正在找到正确的标头,但我不希望这是因为定义的行为,我认为我只是走运。

CMake、Make 和 g++ 如何确定 2 个文件中的哪一个将用于编译给定的 cpp?

注意我不是在问如何修复它,修复它涉及更改标题名称以使其不同或包含包含的相对路径,这不是我担心的。我想知道为什么 CMake 和 g++ 都没有抱怨这两个文件被命名相同并包含在同一个最终可执行文件中。

【问题讨论】:

复制自:***.com/questions/21593/… ? @Amadeus 这是怎么复制的?我的问题和链接的问题彼此无关。在包含标题时,我不是在询问“”和 之间的区别。我在问当你有两个同名的不同标题时会发生什么 你读过这部分:对于#include "filename",预处理器首先在与包含指令的文件相同的目录中搜索?这就是你的答案。编译器查看源文件所在的目录 这个可能更接近:Library include paths with same header name。我不确定 CMake 对这个问题是否有实质性影响。这是一个存在于编译器和预处理器中的问题;不是驱动编译过程的工具。 我猜它只会包含它找到的该文件名的第一次出现。我之前在一个项目中遇到过这个问题,当我在我的CMakeList.txt 中更改我的include_directories 的顺序时出现了这个问题。 【参考方案1】:

预处理器按以下顺序搜索包含文件:

引用形式:

与包含#include 语句的文件位于同一目录中。 在当前打开的包含文件的目录中,按照打开它们的相反顺序。搜索从父包含文件的目录开始,并继续向上通过任何祖父包含文件的目录。 沿着每个 /I 编译器选项指定的路径。 沿着 INCLUDE 环境变量指定的路径。

尖括号形式:

沿着每个 /I 编译器选项指定的路径。 在命令行上进行编译时,沿着 INCLUDE 环境变量指定的路径。

【讨论】:

它比迂腐的要复杂一些,它依赖于实现。 这些细节是编译器特定的。你真的必须说出你说的是哪个编译器。根据语言定义,#include <...>“在一系列实现定义的位置中搜索标题”(注意它说的是“标题”,而不是“文件”;标题不一定是文件),@987654322 @ 搜索“源文件......以实现定义的方式”,如果搜索失败,则重新处理该指令,就好像它使用了 <...> 而不是 "..."。因此,您总是必须依靠实施细节才能知道发生了什么。

以上是关于使用 CMake 和 c++ 编译时,如果两个头文件名称相同,会发生啥情况?的主要内容,如果未能解决你的问题,请参考以下文章

CLion+CMake编写C++程序

使用 cmake 在 windows 上编译 c++ 数据库时出错

使用cmake混编c和c++

cmake中文帮助文档

如何使用cmake和Android NDK在C ++中加载线程支持

gcc make 与cmake