gcc / g ++ :“해당 파일 또는 디렉토리 없음”


87

g++ 다음과 같은 형식의 오류를 제공합니다.

foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory
compilation terminated.

를 사용하여 C 프로그램을 컴파일 할 때도 마찬가지입니다 gcc.

왜 그런 겁니까?


참고 : 이 질문은 이전에 여러 번 요청되었지만 매번 질문자의 상황에 따라 다릅니다. 이 질문의 목적은 다른 사람들이 , 단번에의 중복으로 종료 될 수 있다는 질문을하는 것입니다 . 자주 묻는 질문 .


4
FAQ에 추가되었습니다. 감사합니다!
sbi

답변:


116

컴파일러가 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.cclist

그러나 main.cc:

#include <list>
....

그런 다음 g++ main.cc컴파일러는 먼저 시스템 폴더를 살펴보고 <list>표준 헤더이므로 표준 라이브러리의 일부로 C ++ 플랫폼과 함께 제공 #include되는 파일 이름 list이 지정됩니다.

이것은 모두 약간 단순화되었지만 기본 아이디어를 제공해야합니다.

에 대한 세부 사항 <>/ ""-priorities 및-I

gcc-documentation 에 따르면 include <>"일반적인 Unix 시스템" 에서 우선 순위 는 다음과 같습니다.

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

C ++ 프로그램의 경우 먼저 / usr / include / c ++ / version에서 찾습니다. 위에서 target은 GCC가 코드를 컴파일하도록 구성된 시스템의 정식 이름입니다. [...].

문서에는 다음과 같은 내용도 나와 있습니다.

-Idir 명령 줄 옵션을 사용하여이 목록에 추가 할 수 있습니다. -I로 명명 된 모든 디렉토리 는 기본 디렉토리 이전 에 왼쪽에서 오른쪽 순서로 검색 됩니다. 유일한 예외는 dir이 기본적으로 이미 검색된 경우입니다. 이 경우 옵션이 무시되고 시스템 디렉토리에 대한 검색 순서가 변경되지 않습니다.

#include<list> / #include"list"예제 를 계속하려면 (동일한 코드) :

g++ -I. main.cc

#include<list>
int main () { std::list<int> l; }

실제로 시스템 포함보다 -I.폴더 의 우선 순위를 지정하고 .컴파일러 오류가 발생합니다.


9
질문과 답변의 작성자가 같기 때문에 컴파일러를 "당신의 컴파일러"라고 부르는 것이 좀 이상하다는 것을 알아 차리고 싶습니다.
구두

27
@Jeffrey : 아마도 질문의 작성자는 여기에 일반적인 형식을 맞추려고 할 것입니다. 던노, 물어봐.
Sebastian Mach

1
이 대답은 잘못 #include <>에 나열된 DIRS의 외모 -I기본 시스템 DIRS 전에
조나단 Wakely

5
" 파일 표시 줄이 foo.cc에 상대적인 frobnicate라는 폴더에 있다고 상상해보십시오. "와 함께 제공된 디렉토리 -I는 컴파일중인 파일에 상대적이 아니라 gcc를 실행하는 디렉토리에 상대적입니다. 그렇게한다면 차이가 큽니다g++ -Ifrobnicate blah/foo.cc
Jonathan Wakely

3
PATH환경 변수 (Linux 시스템에서) 의 설정이 컴파일러가 파일을 검색하는 방법에 영향을 미칩니 까?
Matt Phillips 2011
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.