헤더 파일이 포함 된 위치를 확인하는 방법은 무엇입니까?


101

g ++가 포함 파일을 찾을 수 있었던 곳을 어떻게 알 수 있습니까? 기본적으로 내가

#include <foo.h>

g ++는 경로를 추가하거나 변경하기 위해 포함 옵션을 사용하여 검색 경로를 스캔합니다. 그러나 결국에는 g ++가 컴파일하기로 선택한 foo.h의 절대 경로를 알 수있는 방법이 있습니까? 무수한 검색 경로에 하나 이상의 foo.h가있는 경우 특히 관련이 있습니다.

그것을 달성하는 방법이 부족합니다 ... g ++가 기본값과 모든 포함 옵션을 포함 한 후 최종 검색 경로가 무엇인지 알려주는 방법이 있습니까?


1
관련 : 하위 포함 파일이 포함 된 상위 포함 파일을 알 수있는 방법이 있습니까? (: GCC의 -E 아주가없는 ...를 산출하기 위해 처리 할 수있는 힌트가.) 즉 그래프에서 포함-표시합니다
크레이지 Glew

답변:


79

이것은 include 파일의 절대 경로를 나열하는 make 종속성을 제공합니다.

gcc  -M showtime.c

시스템에 포함되지 않도록하려면 (예 :) #include <something.h>다음을 사용하십시오.

gcc  -MM showtime.c

18
"-o myObj.o"와 함께 사용하면 컴파일 된 바이너리가 아닌 출력이 "myObj.o"로 이동합니다. -M에는 암시 적 -E가 있으므로 컴파일이 수행되지 않습니다. -MD가 대신 매우 유용한 옵션이라는 것을 알았습니다. 컴파일을 수행하고 대신 myObj.d에 출력을 넣습니다. * .o와 같은 이상한 효과없이 컴파일 라인 앞에 붙이는 데 적합한 매개 변수를 만들면 이제 바이너리 대신 출력이 포함됩니다. 당신의 도움을 주셔서 감사합니다.
harschware 2011

모든 관련 gcc 옵션이 여기 에 설명되어 있습니다 .
akhan

108
g++ -H ...

또한 포함 파일의 전체 경로를 어떤 헤더에 어떤


7
이것은 내 경험상 -M보다 더 도움이되는 것 같습니다. 나는 무엇을 포함하는지에 대한 계층 적 표시를 좋아합니다.
Brian Minton

좋습니다. 디버그 목적으로 유용합니다.

1
이것이 최고의 답변입니다. 아무것도 변경하지 않고 빌드 프로세스에 추가 할 수 있습니다.
Timmmm 2015 년

4
이것은 실제로 받아 들인 대답보다 질문에 더 많이 대답합니다. 유일한 불행한 문제는 Clang이 파일을 정상적으로 컴파일하는 것을 막을 수 없다는 것 clang++ -MM -H입니다.
rookie1024 2017

@ rookie1024 clang++ -H -fsyntax-only ...출력 파일 생성을 피하고 싶을 때 사용 합니다 gcc.
Lekensteyn

8

확실히 사용

g++ -E -dI  ... (whatever the original command arguments were)

2
이 솔루션에는 다음과 같은 몇 가지 이점이 있습니다. 1. 단일 헤더 파일의 여러 포함을 발견 할 수 있습니다 (-H 및 -M은 포함 된 각 파일을 한 번만 인쇄). 2. 포함 된 위치 (원본의 이름 및 줄 번호)를 볼 수 있습니다. 지시 포함). 3. 따라서 헤더가 직접 또는 간접적으로 포함되는지 또는 둘 다 포함되는지를 확실하게 (!) 구별 할 수 있습니다 (이는 정리에 중요합니다.)
hagello

5

-MM또는 관련 옵션 ( -M, 등) 중 하나 를 사용 하면 다른 모든 전 처리기 출력 (제안 된 g++ -E -dI솔루션 으로 얻을 수있는 것처럼 보임)없이 포함 된 헤더 목록 만 가져옵니다 .


g++ -MM t.cc전혀 포함되지 않음을 보여줍니다 t.o: t.cc. 다른 것이 필요합니까?
wallyk 2011

3
니스-완전성을 위해 /showIncludes옵션을 사용하여 MSVC와 유사하게 얻을 수 있습니다 . MSVC는 헤더 중첩을 보여주기 위해 들여 쓰기도합니다 ( -MGCC에서는 볼 수 없습니다 ).
Michael Burr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.