繁体   English   中英

我的C ++编译器在哪里解析我的#includes?

[英]Where does my C++ compiler look to resolve my #includes?

这是一个非常基本的问题。 我一直在学习C ++,到目前为止我只使用过标准库。 我已经包括像<iostream>这样的东西,没有任何问题。 现在我想使用Apache Xerces,所以我已经将它安装在我的机器上(Debian系统),并且我正在按照一个教程说明我需要包括:

#include <xercesc/sax2/SAX2XMLReader.hpp>

但是g ++说“错误:xercesc / 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.
[...]

您可以使用-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

Gcc通常开始在/ usr / include中查找包含文件。 如果在其他目录中包含文件,则可以在命令行中添加-I选项,以告诉编译器也可以查看。

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

C ++标准在16.2 / 2中说

#include <h-char-sequence> new-line形式的预处理指令搜索一系列实现定义的位置,以查找由<和>分隔符之间的指定序列唯一标识的头。

实现定义意味着搜索where和headers以及如何指定头位置特定于特定编译器。 实际上,有可能实现可能不会在一个文件约定中使用一个头,但是一些花哨的包装系统,例如所有库都应该在.zip中存档头文件这样存档的位置被赋予编译器,然后编译器需要照顾从中提取标题等

这意味着您应该检查您正在使用的编译器的文档,以获取有关如何指定所谓的包含目录 ,标头位置的详细信息。

对于GCC编译器,请使用-I选项 - 有关详细信息,请参阅手册中的“ 目录搜索选项” 您还可以使用C_INCLUDE_PATH或CPLUS_INCLUDE_PATH环境变量。

相关问题是如何在linux中为gcc添加默认包含路径?

要告诉g ++要查看的位置(除了默认值),请使用-I标志:

g++ -I/foo/bar xyz.cpp

告诉它查看/ foo / bar目录并从那里构造路径。 您可以使用多个-I标志来指定编译器开始查找的多个起始点。

在我相当老的Windows系统上,Xerces安装在/ xerces中,所以我设置了一个include标志:

-I/xerces/include

这让我可以说:

#include "sax2/SAX2XMLReader.hpp"

包括文件:

/xerces/include/sax2/SAX2XMLReader.hpp

要使用新库,仅指定头文件是不够的。 您可能还需要使用-l [库名]和-L [库路径]指定要在gcc表达中链接的头文件中定义的相关库。

有关头文件和库之间的区别,请查看此帖子: 什么是头文件和库文件?

MSDN对这两种形式的#include指令进行了很好的总结:

  • 引用形式:

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

  • 角度支架形式:

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

另请参阅此(重复/类似)问题(对于G ++ / GCC):

C ++ #include语义

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM