gcc / g ++ :“해당 파일 또는 디렉토리 없음”
g++
다음과 같은 형식의 오류를 제공합니다.
foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory
compilation terminated.
를 사용하여 C 프로그램을 컴파일 할 때도 마찬가지입니다 gcc
.
왜 그런 겁니까?
참고 : 이 질문은 이전에 여러 번 요청되었지만 매번 질문자의 상황에 따라 다릅니다. 이 질문의 목적은 다른 사람들이 , 단번에 모든 것을 복제하여 닫을 수 있다는 질문을하는 것입니다 . 자주 묻는 질문 .
컴파일러가 foo.cc
. line number line
를 누르면 컴파일러는 다음을 찾습니다.
#include "bar"
또는
#include <bar>
그런 다음 컴파일러는 해당 파일을 찾으려고합니다. 이를 위해 디렉토리 세트를 사용하여 조사하지만이 세트 내에는 file이 없습니다 bar
. include 문의 버전 간의 차이점에 대한 설명은 여기를 참조하십시오 .
컴파일러에게 어디서 찾을 수 있는지 알려주는 방법
g++
옵션이 -I
있습니다. 명령 줄에 포함 검색 경로를 추가 할 수 있습니다. 파일 bar
이에 frobnicate
상대적인 이라는 폴더에 foo.cc
있다고 가정합니다 (이있는 디렉토리에서 컴파일한다고 가정 foo.cc
).
g++ -Ifrobnicate foo.cc
더 많은 include-path를 추가 할 수 있습니다. 당신이 제공하는 각각은 현재 디렉토리에 상대적입니다. Microsoft의 컴파일러에는 /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 <>
되며 incude ""
.
차이 사이 #include <bar>
와#include "bar"
일반적으로는 #include <xxx>
시스템 폴더를 먼저 #include "xxx"
살펴보고 현재 또는 사용자 정의 폴더를 먼저 살펴 봅니다.
예 :
프로젝트 폴더에 다음 파일이 있다고 가정 해보십시오.
list
main.cc
와 함께 main.cc
:
#include "list"
....
이를 위해 컴파일러는 현재 컴파일 되고 현재 폴더에 해당 파일이 있기 때문에 프로젝트 폴더에 #include
파일 list
이 있습니다 .main.cc
list
그러나 main.cc
:
#include <list>
....
and then g++ main.cc
, your compiler will look into the system folders first, and because <list>
is a standard header, it will #include
the file named list
that comes with your C++ platform as part of the standard library.
This is all a bit simplified, but should give you the basic idea.
Details on <>
/""
-priorities and -I
According to the gcc-documentation, the priority for include <>
is, on a "normal Unix system", as follows:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
For C++ programs, it will also look in /usr/include/c++/version, first. In the above, target is the canonical name of the system GCC was configured to compile code for; [...].
The documentation also states:
You can add to this list with the -Idir command line option. All the directories named by -I are searched, in left-to-right order, before the default directories. The only exception is when dir is already searched by default. In this case, the option is ignored and the search order for system directories remains unchanged.
To continue our #include<list> / #include"list"
example (same code):
g++ -I. main.cc
and
#include<list>
int main () { std::list<int> l; }
and indeed, the -I.
prioritizes the folder .
over the system includes and we get a compiler error.
참고URL : https://stackoverflow.com/questions/12919081/gcc-g-no-such-file-or-directory
'developer tip' 카테고리의 다른 글
앵커를 숨기지 않고 앵커 텍스트를 숨기려면 어떻게합니까 (0) | 2020.11.06 |
---|---|
Java에서 컬렉션이 비어 있는지 확인 : 가장 좋은 방법은 무엇입니까? (0) | 2020.11.06 |
Windows 용 Docker가 작동하지 않음 (0) | 2020.11.05 |
Angular 2 : 부모 구성 요소에서 RouteParams 가져 오기 (0) | 2020.11.05 |
마지막 호출이 조건부 일 때 C # 컴파일러가 메서드 호출 체인을 제거하는 이유는 무엇입니까? (0) | 2020.11.05 |