gcc/g++: "그런 파일 또는 디렉터리가 없습니다."
g++
다음 형식의 오류가 나타납니다.
foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory
compilation terminated.
C 프로그램을 컴파일 할 때도 마찬가지입니다.gcc
.
왜 그런 것일까요?
주의:이 질문은 이전에도 여러 번 제기되었지만 매번 질문자의 상황에 따라 다릅니다.이 질문의 목적은 다른 질문을 완전히 복제하여 정리할 수 있는 FAQ입니다.
컴파일러가 파일 컴파일을 시도했습니다.foo.cc
. 회선 번호를 누르면line
컴파일러는 다음을 검색합니다.
#include "bar"
또는
#include <bar>
그런 다음 컴파일러가 해당 파일을 검색하려고 합니다.이 경우 디렉토리 세트를 사용하여 조사하지만 이 세트에는 파일이 없습니다.bar
include 문장의 버전 간 차이에 대한 설명은 여기를 참조하십시오.
컴파일러에게 검색 위치를 알려주는 방법
g++
옵션이 있다-I
. 명령줄에 포함 검색 경로를 추가할 수 있습니다.당신의 파일이bar
라는 이름의 폴더에 있습니다.frobnicate
, 상대적인foo.cc
(이 디렉토리에서 컴파일하고 있습니다.foo.cc
위치) :
g++ -Ifrobnicate foo.cc
include-paths를 추가할 수 있습니다.각 패스는 현재 디렉토리에 상대적입니다.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>
표준 헤더입니다.#include
라는 이름의 파일list
C++ 플랫폼에 표준 라이브러리의 일부로 포함되어 있습니다.
이 모든 것은 조금 단순하지만 기본적인 개념을 제시해야 합니다.
: 보보 details details <>
/""
- 및 - 자격-I
gcc-document에 따르면,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.
는, 폴더 「」의 priority를 합니다..
이치노
또한 헤더 파일 이름에 "struct" 또는 "Struct" 문자를 포함하면 컴파일러가 동일한 "no scheat file or directory" 오류를 발생시킨다는 점에서 컴파일러 버그가 발생할 수 있습니다.
이 방법은 sudo apt-get install libx11-dev에서 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/12919081/gcc-g-no-such-file-or-directory
'programing' 카테고리의 다른 글
Java - POST 방식으로 HTTP 파라미터를 쉽게 전송 (0) | 2022.08.09 |
---|---|
Spring RestTemplate를 사용하여 JSON 개체 목록 가져오기 (0) | 2022.08.09 |
Synchronized(이것)를 사용할 수 있는데 ReentrantLock을 사용하는 이유는 무엇입니까? (0) | 2022.08.09 |
퀘이사 프레임워크에서 전역 개체를 저장할 위치 (0) | 2022.08.09 |
Java SimpleDateFormat("yyy-MM-dd'T'")HH:mm:ss'Z'") 시간대를 IST로 지정합니다. (0) | 2022.08.09 |