g++
给我报错的形式为:
foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory
compilation terminated.
使用gcc
编译C程序也是一样。
为什么会这样呢?
请注意:这个问题已经被问过很多次,但每次都是针对提问者的具体情况。这个问题的目的是创建一个可以关闭其他重复问题的问题,一劳永逸;成为一个常见问题解答。
您的编译器尝试编译名为foo.cc
的文件。在到达第line
行时,编译器发现:
#include "bar"
或者
#include <bar>
bar
文件。关于include语句版本之间的区别,请点击这里了解更多。g++
有一个选项-I
,它允许你将包含搜索路径添加到命令行中。假设你的bar
文件在名为frobnicate
的文件夹中,相对于foo.cc
(假设你正在从foo.cc
所在的目录进行编译)。g++ -Ifrobnicate foo.cc
/I
,它的工作方式相同,或者在Visual Studio中,可以在项目的属性页面下的“配置属性->C/C++->常规->附加包含目录”中设置文件夹。现在想象一下,在不同的文件夹中有多个版本的bar
。// A/bar
#include<string>
std::string which() { return "A/bar"; }
// B/bar
#include<string>
std::string which() { return "B/bar"; }
// C/bar
#include<string>
std::string which() { return "C/bar"; }
// foo.cc
#include "bar"
#include <iostream>
int main () {
std::cout << which() << std::endl;
}
#include "bar"
的优先级是最左边的:
$ g++ -IA -IB -IC foo.cc
$ ./a.out
A/bar
A/
、B/
和 C/
时,会停留在第一个或最左边的匹配项。#include <>
和 #include ""
两种形式都是正确的。
#include <bar>
和 #include "bar"
的区别#include <xxx>
会优先查找系统文件夹,而 #include "xxx"
则会优先查找当前或自定义文件夹。list
main.cc
使用 main.cc
:
#include "list"
....
因此,您的编译器将在项目文件夹中#include
文件list
,因为它当前正在编译main.cc
,并且当前文件夹中有该文件list
。
但是对于main.cc
:
#include <list>
....
然后执行g++ main.cc
,你的编译器会首先查找系统文件夹,因为<list>
是一个标准头文件,所以它会将随C++平台一起提供的名为list
的文件作为标准库的一部分进行#include
。
这只是简化了的内容,但应该能给你基本的理解。
<>
/""
优先级和-I
的详细信息根据gcc文档,在“普通Unix系统”上,include <>
的优先级如下:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
g++ -I. main.cc
并且
#include<list>
int main () { std::list<int> l; }
实际上,-I
优先考虑文件夹 .
而不是系统包含文件,因此我们会得到编译器错误。
这对我有效,sudo apt-get install libx11-dev
PATH
环境变量设置是否会影响编译器文件搜索? - Matt Phillips