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

时间:2010-01-23 15:51:51

标签: c++

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

<iostream>

但是g ++说“错误:xercesc / sax2 / SAX2XMLReader.hpp:没有这样的文件或目录”。在哪里看?我需要提供更多信息吗?

感谢。

6 个答案:

答案 0 :(得分:19)

使用--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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

C++ Standard在16.2 / 2中说明

  

表单的预处理指令   #include <h-char-sequence>   new-line搜索一系列实现定义的地点   标题由&lt;之间的指定序列唯一标识。和&gt;分隔符

实现定义的意味着搜索where和headers以及如何指定头位置是特定于特定编译器的。实际上,有可能实现可能不会在一个文件约定中使用一个头,但是一些花哨的包装系统,例如所有库都应该在.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?

答案 3 :(得分:1)

要告诉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

答案 4 :(得分:0)

#{3}}对#include指令的两种形式进行了很好的总结:

  • 引用表格:
  
    

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

  
  • 角度支架形式:
  
    

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

  

另见(重复/类似)问题(对于G ++ / GCC):

MSDN

答案 5 :(得分:0)

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

有关头文件和库之间的区别,请查看此帖子:What are Header Files and Library Files?