我的 C++ 编译器在哪里解决我的#includes?
Posted
技术标签:
【中文标题】我的 C++ 编译器在哪里解决我的#includes?【英文标题】:Where does my C++ compiler look to resolve my #includes? 【发布时间】:2011-01-08 14:01:13 【问题描述】:这是一个非常基本的问题。我一直在学习 C++,到目前为止我只使用了标准库。我一直在包括<iostream>
之类的东西,没有任何问题。现在我想使用 Apache Xerces,所以我已经将它安装在我的机器(一个 Debian 系统)上,并且正在遵循一个说我需要包含的教程:
#include <xercesc/sax2/SAX2XMLReader.hpp>
但是 g++ 说“错误:xercesc/sax2/SAX2XMLReader.hpp:没有这样的文件或目录”。它在看哪里?我需要提供更多信息吗?
谢谢。
【问题讨论】:
【参考方案1】:使用--verbose
选项:
[...]
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/i686-pc-linux-gnu/4.4.2/../../../../include/c++/4.4.2
/usr/lib/gcc/i686-pc-linux-gnu/4.4.2/../../../../include/c++/4.4.2/i686-pc-linux-gnu
/usr/lib/gcc/i686-pc-linux-gnu/4.4.2/../../../../include/c++/4.4.2/backward
/usr/local/include
/usr/lib/gcc/i686-pc-linux-gnu/4.4.2/include
/usr/lib/gcc/i686-pc-linux-gnu/4.4.2/include-fixed
/usr/include
End of search list.
[...]
您可以使用-I
选项添加搜索目录,如下所述:http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Directory-Options.html#Directory-Options
您也可以使用环境变量来永久更改此设置:http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Environment-Variables.html#Environment-Variables
在您的情况下,您可以使用CPLUS_INCLUDE_PATH
。
【讨论】:
【参考方案2】:Gcc 通常开始在 /usr/include 中寻找包含文件。如果你在其他目录中有包含文件,你可以在命令行中添加一个-I
选项来告诉编译器也去那里查看。
您可能必须安装 Xerces 的开发包才能获取 #include 文件。
【讨论】:
【参考方案3】:C++ Standard 在 16.2/2 中说
形式的预处理指令
#include <h-char-sequence>
new-line 在一系列实现定义的位置中搜索 由 分隔符之间的指定序列唯一标识的标头
implementation-defined 意味着搜索头文件的位置和头文件位置以及如何指定头文件位置是特定于特定编译器的。事实上,有可能实现可能不会在一个文件约定中使用一个头文件,但是一些花哨的打包系统,例如所有库都应该在 .zip 存档中发送头文件,此类存档的位置被提供给编译器,然后编译器采用关心从中提取标题等。
这意味着您应该检查您正在使用的编译器的文档,以获取有关如何指定所谓的包含目录、标头位置的详细信息。
如果是 GCC 编译器,请使用 -I 选项 - 有关详细信息,请参阅手册中的 Options for Directory Search。您也可以使用C_INCLUDE_PATH or CPLUS_INCLUDE_PATH 环境变量。
相关问题是How to add a default include path for gcc in linux?
【讨论】:
【参考方案4】:要告诉 g++ 去哪里看(除了它的默认值),你使用 -I 标志:
g++ -I/foo/bar xyz.cpp
告诉它查看 /foo/bar 目录并从那里构造路径。您可以使用多个 -I 标志来指定编译器开始查找的多个起点。
在我比较老的 Windows 系统上,Xerces 安装在 /xerces 中,所以我设置了一个包含标志:
-I/xerces/include
这让我可以说:
#include "sax2/SAX2XMLReader.hpp"
包含文件:
/xerces/include/sax2/SAX2XMLReader.hpp
【讨论】:
【参考方案5】:MSDN 很好地总结了#include 指令的两种形式:
引用表格:角括号形式:此表单指示预处理器在包含#include 语句的文件的同一目录中查找包含文件,然后在包含(#include)该文件的任何文件的目录中查找。然后预处理器沿着 /I 编译器选项指定的路径搜索,然后沿着 INCLUDE 环境变量指定的路径搜索。
这种形式指示预处理器首先沿着 /I 编译器选项指定的路径搜索包含文件,然后在从命令行编译时,沿着 INCLUDE 环境变量指定的路径搜索。
另请参阅此(重复/类似)问题(针对 G++/GCC):
C++ #include semantics
【讨论】:
他在询问 g++,而不是 Microsoft 产品。 C++ 标准对于 #include 查找内容的位置非常模糊,而且您发布的内容与标准所说的不符。 @Neil Butterworth - 正确。它依赖于编译器。我包含的重复/类似链接包含专门关于 GCC/G++ 的帖子。 鉴于它依赖于编译器,我不确定在答案中关注除 OP 使用的编译器之外的编译器有多大意义。 . .【参考方案6】:为了使用新库,仅指定头文件是不够的。您可能还需要使用 -l[library name] 和 -L[library path] 指定要在 gcc 推荐中链接的头文件中定义的相关库。
头文件和库的区别,请看这个帖子:What are Header Files and Library Files?
【讨论】:
我很确定目标是进行设置,以便仅指定头文件 就足够了。以上是关于我的 C++ 编译器在哪里解决我的#includes?的主要内容,如果未能解决你的问题,请参考以下文章
此代码在 DevC++ 中编译没有问题,但 Visual Studio 2008 发出这些警告并拒绝编译。我的错误在哪里?