"기본" C++ 포함 기본 경로를 얻는 관용적 방법은 무엇입니까?

"기본" C++ 포함 기본 경로를 얻는 관용적 방법은 무엇입니까?

어떤 이유로 C++ 포함 루트 /usr/include/c++/10(예: GCC-10의 libstdc++)가 필요한 유틸리티에 대한 명령줄을 작성 중입니다. 내 질문은: 내 시스템에서 해당 경로가 무엇인지 어떻게 확인합니까? 아니면 이 작업을 수행하는 관용적인 방법은 무엇입니까?

분명히 using 을 재정의하는 것이 가능 CPLUS_INCLUDE_PATH하지만 이 경우는 간단합니다. 여러 C++ 컴파일러가 설치된 경우(여러 버전의 GCC 포함) 어떻게 해야 합니까? /usr/include버전 번호를 "수동으로" 정렬할 수 있는 다른 방법이 있나요?

답변1

좋은 질문.

내 컴퓨터에서는 다음을 얻습니다.

$ find /usr/include -name string
/usr/include/c++/8/debug/string
/usr/include/c++/8/experimental/string
/usr/include/c++/8/string
/usr/include/c++/9/debug/string
/usr/include/c++/9/experimental/string
/usr/include/c++/9/string
/usr/include/c++/10/debug/string
/usr/include/c++/10/experimental/string
/usr/include/c++/10/string
/usr/include/c++/11/debug/string
/usr/include/c++/11/experimental/string
/usr/include/c++/11/string
/usr/include/c++/12/debug/string
/usr/include/c++/12/experimental/string
/usr/include/c++/12/string

어떤 프로그램이 사용되고 있는지 알아내기 위해 gcc를 사용하여 빈 프로그램을 처리하고 해당 검색 경로를 인쇄할 수 있습니다.

$ g++ -E -xc++ - -v < /dev/null
...
#include <...> search starts here:
 /usr/include/c++/12
 /usr/include/x86_64-linux-gnu/c++/12
 /usr/include/c++/12/backward
 /usr/lib/gcc/x86_64-linux-gnu/12/include
 /usr/include/x86_64-linux-gnu
 /usr/include
...

로고 설명:

  • -E: 전처리만 가능하며 컴파일, 어셈블 또는 링크하지 않습니다.
  • -xc++: 언어 지정(C++)
  • -: 파일 대신 표준 입력에서 입력을 얻습니다.
  • -v: 컴파일러가 호출한 프로그램을 표시합니다.
  • < /dev/null: 표준 입력으로 null 값을 보냅니다.

원본 메이크파일에 또는 를 추가 CFLAGS하고 CPPFLAGS컴파일된 출력을 구문 분석하는 것이 더 좋습니다. 이는 makefile이 -I....

예:

$ g++ -E -xc++ - -v -I/tmp < /dev/null
...
#include <...> search starts here:
 /tmp                                 <-- NEW because of -I/tmp
 /usr/include/c++/12
 /usr/include/x86_64-linux-gnu/c++/12
 /usr/include/c++/12/backward
 /usr/lib/gcc/x86_64-linux-gnu/12/include
 /usr/include/x86_64-linux-gnu
 /usr/include
...

관련 정보