gcc는 C 및 C ++ 헤더 파일을 어디에서 찾습니까?


186

유닉스 시스템에서 gcc는 헤더 파일을 어디에서 찾습니까?

오늘 아침에 약간의 시스템 헤더 파일을 찾기 위해 시간을 보냈으므로 여기에 유용한 정보라고 생각했습니다.

답변:


227
`gcc -print-prog-name=cc1plus` -v

이 명령은 gcc에게 사용중인 C ++ 전처리기를 요청한 다음 포함 할 전처리기를 묻습니다.

특정 설정에 대한 신뢰할 수있는 답변을 얻을 수 있습니다.

마찬가지로 C 전 처리기의 경우 :

`gcc -print-prog-name=cpp` -v

2
그 의미는 무엇입니까? 나는 이것을 찾기가 어렵다.
mijiturka


5
나는 C의 추측 전처리 입니다 cpp대신 cc1? 내 데비안 제시에 $(gcc -print-prog-name=cpp) -v(제대로)은 또 하나 개의 경로 제공/usr/include/x86_64-linux-gnu
wlnirvana

3
당신은 입력에서 리디렉션 입력을 기다리는 끊지하려면 /dev/null, 그래서 `gcc -print-prog-name=cc1` -v < /dev/null.
Steve Jorgensen

트윗 담아 가기 또는 Ctrl+를 누르면 DUnix-talk에서 "파일 끝"이 전송됩니다.
Drew Dormann

40

또한 gcc는 -I옵션 뒤에 지정된 디렉토리를 찾습니다 .



4
@totaam : 글꼴을 확인하십시오! 이 답변은 "-l"(소문자 "ell")이 아닌 "-I"(대문자 "눈")를 사용합니다.

3
-I는 <anglebracketed.h>이고 -iquote는 "quotedfiles.h"입니다
jcomeau_ictx

28

가짜 시스템 헤더를 포함시키려는 파일을 작성할 수 있습니다. 이러한 소스에서 상세 모드로 gcc를 실행하면 가짜 헤더를 찾을 때 모든 시스템 포함 위치가 나열됩니다.

$ echo "#include <bogus.h>" > t.c; gcc -v t.c; rm t.c

[..]

#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-apple-darwin9/4.0.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.

[..]

t.c:1:32: error: bogus.h: No such file or directory

3
방금 "-v 옵션 사용"이라고 말하면 더 도움이 될 것입니다.
Jay Conrod 2016

존재하지 않는 시스템 헤더를 포함하는 C 파일없이 "-v"를 사용하면 gcc가 모든 포함 경로를 반복하지는 않습니다. 내 대답의 핵심은 시스템 헤더로 나열된 bogus.h입니다.
diciu

@Jay-맞습니다. 너무 모호했습니다. 쉘 스크립트에서 내가하고있는 일을 설명했습니다.
diciu

9
임시 파일이없는 경우 :echo "#include <bogus.h>" | gcc -v -x c -
thejoshwolfe

2
gcc -v -E - < /dev/null또는 cpp -v < /dev/null충분하다. 전처리기를 실행 해야합니다. 입력 내용은 중요하지 않습니다. (검색 경로는 입력을보기 전에 시작하는 동안 인쇄됩니다.)
zwol

17

GCC 매뉴얼CPP 섹션 은 헤더 파일이 다음 디렉토리에있을 수 있음을 나타냅니다.

GCC는 여러 곳에서 헤더를 찾습니다. 일반적인 유닉스 시스템에서는 달리 지시하지 않으면 #include에서 다음과 같이 요청 된 헤더를 찾습니다.

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

C ++ 프로그램의 경우 먼저 / usr / include / g ++-v3을 살펴 봅니다.


현재 버전의 gcc에 적합합니다. 찾는 실제 디렉토리는 gcc가 빌드 될 때 지정된 옵션에 따라 다릅니다. 더 나은 솔루션은 Shmoopty 답변을 참조하십시오.
Martin York

추신 : 내 C ++ 헤더 파일은 다음 위치에 있습니다. /usr/include/c++/4.0.0
Martin York

3
@ 마틴 : 당신은 오래된 학교입니다. 내 /usr/include/c++/4.2에 있습니다 :)
Bill the Lizard

10

GCC가 시스템 헤더를 찾을 디렉토리의 전체 세트를 인쇄하게하려면 다음과 같이 호출하십시오.

$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 | 
  LC_ALL=C sed -ne '/starts here/,/End of/p'

양식의 출력을 생성합니다

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/5/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.

-I명령 행에 -family 옵션 이 있으면 출력되는 내용에 영향을줍니다.

(이 sed명령은 이 호출이 인쇄 하는 다른 모든 정크를 제거 LC_ALL=C하고 sed명령이 작동 하는지 확인하는 것입니다 . "여기에서 시작"및 "검색 목록 끝"문구 IIRC 번역됩니다.


9
g++ -print-search-dirs
gcc -print-search-dirs

3
이 명령은 링크 라이브러리 및 컴파일러의 내부 구성 요소에 대한 기본 검색 경로를 인쇄합니다. 헤더 파일에 대해서는 아무 것도 알려주지 않습니다.
zwol

6

컴파일러가 헤더 파일을 찾는 경로 세트는 다음 명령으로 확인할 수 있습니다.

cpp -v

#include "" 를 선언하면 하면 컴파일러는 먼저 소스 파일의 현재 디렉토리를 검색하고 찾지 못한 경우 위의 검색된 디렉토리에서 계속 검색합니다.

#include <> 를 선언하면 하면 컴파일러는 위 명령에서 얻은 디렉토리에서 직접 검색합니다.

출처 : -http : //commandlinefanatic.com/cgi-bin/showarticle.cgi ? article=art026


1

다음을 확인하여 bash에서 C 프로그램의 (추가) 포함 경로를 볼 수 있습니다.

echo $C_INCLUDE_PATH

비어있는 경우 다음을 통해 기본 포함 위치를 추가하도록 수정할 수 있습니다.

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include

1

헤더 파일이 갈매기 형 <>에 포함되어있는 경우 gcc가 지정된 헤더 파일에 대해 기본적으로 찾는 디렉토리입니다. 1. / usr / local / include /-타사 헤더 파일에 사용됩니다. 2. / usr / include /-시스템 헤더 파일에 사용됩니다.

위에서 언급 한 디렉토리 이외의 위치에 사용자 정의 헤더 파일을 배치하기로 결정한 경우 다음과 같이 포함 할 수 있습니다. 1. 쉐브론 대신 파일 경로와 함께 따옴표 ( "./custom_header_files/foo.h") 사용 include 문에서. 2. 코드를 컴파일 할 때 -I 스위치를 사용하십시오. gcc -I / home / user / custom_headers / -c foo.c -p foo.o 기본적으로 -I 스위치는 컴파일러에게 -I 스위치로 지정된 디렉토리를 먼저 찾도록 지시합니다 (표준 디렉토리를 확인하기 전에). -I 스위치를 사용하면 쉐브론을 사용하여 헤더 파일이 포함될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.