这是一个非常基本的问题。我一直在学习C ++,到目前为止我只使用过标准库。我一直在包括像{{1}}这样的东西,没有任何问题。现在我想使用Apache Xerces,所以我已经将它安装在我的机器上(Debian系统),并且正在按照一个教程说明我需要包括:
<iostream>
但是g ++说“错误:xercesc / sax2 / SAX2XMLReader.hpp:没有这样的文件或目录”。在哪里看?我需要提供更多信息吗?
感谢。
答案 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环境变量。
答案 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):
答案 5 :(得分:0)
为了使用新库,仅指定头文件是不够的。您可能还需要使用-l [库名]和-L [库路径]指定要在gcc表达中链接的头文件中定义的相关库。
有关头文件和库之间的区别,请查看此帖子:What are Header Files and Library Files?