developer tip

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

copycodes 2020. 11. 5. 08:14
반응형

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.cclist

그러나 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

반응형