최신 GCC 버전을 사용하고 싶습니다. 그래서 GCC 10을 컴파일하여 비표준 디렉토리에 설치했습니다 /software/gcc10/
. 여태까지는 그런대로 잘됐다.
그런데 실제로 이 새 버전의 GCC를 사용하려고 했을 때 문제가 발생했습니다. 그러한 변수를 PATH
포함하도록 변수를 수정했으며 이제 시스템이 (내 시스템의 GCC 8 컴파일러 대신) 새로운 GCC 10 컴파일러를 찾는지 확인했습니다./software/gcc10/bin/
gcc --version
그러나 이 설정으로 프로그램을 컴파일하려고 하면 std::filesystem
GCC 10의 일부여야 하는 libstdc++에 대한 정의되지 않은 참조에 대한 오류가 발생합니다. 내 가정은 지금은 최신 컴파일러를 사용하고 있지만 링커는 여전히 /software/gcc10/lib64
.
적절한 디렉토리를 포함하도록 변경해 보았지만 LD_LIBRARY_PATH
아무런 효과가 없는 것 같습니다.
gcc
옵션을 사용하여 실행 결과를 확인하는 동안 환경 변수를 우연히 -v
발견했습니다 .LIBRARY_PATH
gcc 문서다음과 같이 사용하세요:
LIBRARY_PATH의 값은 PATH와 매우 유사한 콜론으로 구분된 디렉터리 목록입니다. 네이티브 컴파일러로 구성되면 GCC는 GCC_EXEC_PREFIX를 사용하여 특수 링커 파일을 찾을 수 없는 경우 지정된 디렉터리를 검색합니다. -l 옵션을 사용하여 일반 라이브러리를 검색할 때 GCC와의 연결은 이러한 디렉터리(그러나 먼저 -L로 지정된 디렉터리 포함)를 사용합니다.
사실, LIBRARY_PATH
그에 따라 변수를 설정하면 프로그램을 성공적으로 컴파일할 수 있습니다. 그러나 이것은 gcc에 특정한 솔루션인 것 같으며 이를 수행하는 보다 표준적인 방법이 있는지 궁금하지 않을 수 없습니다(예: 이것은 또한 링크할 C++ 표준 라이브러리를 찾을 위치를 clang에게 알려줍니다).
더 나은 해결책은 새로운 GCC 10 컴파일러가 항상 GCC 10 stdlib를 사용하도록 만드는 것입니다. 반면 시스템의 GCC 8 컴파일러를 호출하면 항상 시스템 GCC 8 stdlib에 연결됩니다. 특정 stdlib를 사용해야 한다고 특정 컴파일러 바이너리에 알리는 방법이 있습니까?
답변1
환경 LIBRARY_PATH
변수는 꽤 표준적입니다. 대부분의 컴파일러는 이것을 알고 있습니다.
C_INCLUDE_PATH
또한 및/또는 을 사용해야 합니다 CPLUS_INCLUDE_PATH
. 이 두 가지는 gcc에 더 구체적입니다(다른 컴파일러는 INCLUDE
언어 분리를 선호하지 않습니다).
환경 변수를 완전히 무시하고 명령줄에서 직접 올바른 libstdc++를 지정할 수도 있습니다.
g++ main.cpp /software/gcc10/.../libstdc++.a