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>
....
그런 다음 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.
폴더 의 우선 순위를 지정하고 .
컴파일러 오류가 발생합니다.