我尝试使用gcc-4.9编译以下简单的c ++文件(a.cpp)。
#include <iostream>
#include <foo>
using namespace std;
int main()
{
int x = 3;
cout << f(x) << endl;
return 0;
}
“foo”也是以下简单的c ++文件(删除include guard以使代码更简单)。
int f(int ret){
return ret + 1;
}
我无法使用gcc-4.9编译a.cpp,因为编译器说:
a.cpp:2:15: fatal error: foo: No such file or directory
我认为导致编译错误是因为用户定义的文件包含在标准头文件中(括号括起来,“&lt; ***&gt;”)。
之前,我看到同样的错误,并且知道两种方法来解决这些编译错误。
首先是将编译器gcc-4.9更改为gcc-5.0。
第二个正在取代
#include <foo>
与
#include "foo"
虽然我不知道为什么编译错误是通过这些方法解决的,但我从现在开始这样做。
但是现在,我看到了第二种方法无法解决的代码。 它包含许多用户定义的文件作为许多头文件中的标准文件。因此,通过第二种方法,我们必须编辑许多头文件。
它也是通过第一种方法解决的,但我现在想用gcc-4.9编译。 我想如果有一种方法可以通过gcc-4.9编译“a.cpp”而不进行编辑,则可以用相同的方法编译代码。
如何在不编辑的情况下编译gcc-4.9的“a.cpp”。为什么我可以用gcc-5.0编译“a.cpp”?
答案 0 :(得分:2)
#include "file"
将在与包含它的文件相同的目录中查找file
。 #include <file>
仅依赖于包含路径,因此您需要在编译命令行上-I.
(或者不管路径是什么)。
答案 1 :(得分:0)
#include <foo>
和#include "foo"
并不是一回事。
首先只在标准位置查找foo
文件,而后者在当前目录中查找,然后在标准位置查找。{p>这就是您应该将#include "foo"
用于本地包含文件而从不 #include <foo>
的原因。
但标准位置列表可使用-I
选项进行配置:gcc -I/path/to/include/dir -other_options source.c -o executable
。如果使用linux获取更多详细信息,请选择man gcc或info gcc。
即使-I.
选项允许您始终使用#include <foo>
,如果您希望其他人可以阅读您的代码,请不要这样做。
答案 2 :(得分:0)
哪些文件包含找不到? 我在猜一个子目录。
在这种情况下,答案是将子目录添加到搜索路径或将include更改为
#include "subdirectory/name_of_file"