C++ 我的C++;编译器查找以解决我的#includes?

C++ 我的C++;编译器查找以解决我的#includes?,c++,C++,这是一个非常基本的问题。我一直在学习C++,到目前为止我只使用了标准库。我已经包括了之类的内容,而且没有任何问题。现在我想使用Apache Xerces,所以我已经在我的机器(Debian系统)上安装了它,并遵循一个教程,其中说我需要包括: #include <xercesc/sax2/SAX2XMLReader.hpp> #包括 但是g++说“错误:xercesc/sax2/SAX2XMLReader.hpp:没有这样的文件或目录”。它在哪里?我需要给它更多的信息吗 谢谢。Gc

这是一个非常基本的问题。我一直在学习C++,到目前为止我只使用了标准库。我已经包括了
之类的内容,而且没有任何问题。现在我想使用Apache Xerces,所以我已经在我的机器(Debian系统)上安装了它,并遵循一个教程,其中说我需要包括:

#include <xercesc/sax2/SAX2XMLReader.hpp>
#包括
但是g++说“错误:xercesc/sax2/SAX2XMLReader.hpp:没有这样的文件或目录”。它在哪里?我需要给它更多的信息吗


谢谢。

Gcc通常开始在/usr/include中查找include文件。如果您在其他目录中有include文件,您可以在命令行中添加-I选项,让编译器也在那里查看

您可能必须安装Xerces的开发包才能获取#include文件。

要告诉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
使用
--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.
[...]
[…]
#包括“…”搜索从这里开始:
#包括搜索从这里开始:
/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/本地/包括
/usr/lib/gcc/i686 pc linux gnu/4.4.2/include
/usr/lib/gcc/i686 pc linux gnu/4.4.2/include-fixed
/usr/包括
搜索列表结束。
[...]
您可以使用
-I
选项添加搜索目录,如下所述:

您还可以使用环境变量永久更改此设置:
在您的情况下,您可以使用
CPLUS\u INCLUDE\u PATH

INCLUDE指令的两种形式概括如下:

  • 引用表格:
此表单指示预处理器在包含#include语句的文件的同一目录中查找include文件,然后在包含(#include)该文件的任何文件的目录中查找include文件。然后,预处理器沿着/I编译器选项指定的路径进行搜索,然后沿着INCLUDE环境变量指定的路径进行搜索

  • 角括号形式:
此表单指示预处理器首先沿/I编译器选项指定的路径搜索包含文件,然后在从命令行编译时,沿包含环境变量指定的路径搜索包含文件

另请参见此(重复/类似)问题(适用于G++/GCC):

第16.2/2节中提到

表单的预处理指令
#包括
新行在实现定义的位置序列中搜索 由<和>分隔符之间的指定序列唯一标识的标头

定义的实现意味着搜索的位置和头以及如何指定头位置是特定于特定编译器的。事实上,实现可能不会在一个文件约定中使用一个头,但有些奇特的打包系统,例如,所有库都应该在其中发送头。zip存档将此类存档的位置提供给编译器,然后编译器负责从中提取头,等等

它的意思是,您应该检查正在使用的编译器的文档,以了解有关如何指定所谓的包含目录、标题位置的详细信息

对于GCC编译器,请使用-I选项-有关详细信息,请参阅手册中的。您还可以使用环境变量


相关问题是

为了使用新库,仅指定头文件是不够的。您可能还需要使用-l[library name]和-l[library path]指定头文件中定义的相关库,以便在gcc中链接这些库


关于头文件和库之间的区别,请查看以下帖子:

他问的是g++,而不是微软的产品。“C++的标准对于哪里包括事物,以及你所发布的东西与标准所说的不相符,这是非常模糊的。”尼尔巴特沃思-正确。它依赖于编译器。我包含的重复/类似链接包含一篇专门关于GCC/G++的帖子。鉴于它依赖于编译器,我不确定在回答中关注OP使用的编译器以外的编译器有多大意义。我很确定我们的目标是设置一些东西,这样只指定头文件就足够了。