어떤 이유로 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
...