gcc 컴파일은 "치명적인 오류: 문자열: 해당 파일 또는 디렉터리가 없습니다 #include"로 종료됩니다."

gcc 컴파일은 "치명적인 오류: 문자열: 해당 파일 또는 디렉터리가 없습니다 #include"로 종료됩니다."

내 상황. uname -a주어진Linux computer2 4.4.0-62-generic #83~14.04.1-Ubuntu SMP Wed Jan 18 18:10:30 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

설치하려고 하는데HDF5 1.8.18그리고GNU make 3.81옮기다GCC 6.3.0. Ubuntu 배포판과 함께 제공되는 gcc 6.3.0 및 버전 4.8.4를 성공적으로 설치했습니다.

내 gcc 6.3.0은 에 있습니다 /opt/gcc/6_3_0/. 다음 스크립트를 사용하여 비표준 디렉터리의 명령, 라이브러리 및 헤더를 구성하고 전달합니다.

export FC='/opt/gcc/6_3_0/bin/gfortran-6.3.0'   # probably unnecessary
export CC='/opt/gcc/6_3_0/bin/gcc-6.3.0'  
export CXX='/opt/gcc/6_3_0/bin/g++-6.3.0' 
export CPP='/opt/gcc/6_3_0/bin/cpp-6.3.0'
export LDFLAGS='-L/opt/gcc/6_3_0/lib -L/opt/gcc/6_3_0/lib64' 
export CPPFLAGS='-I/opt/gcc/6_3_0/include -I/opt/gcc/6_3_0/lib/gcc/x86_64-pc-linux-gnu/6.3.0/include'

./configure \
--prefix=${insdir} \
--with-zlib=${zlibdir}/include,${zlibdir}/lib \
--enable-fortran \
--enable-cxx

그 중에는 zlib의 위치인 ${insdir}설치 디렉터리가 있습니다 ${zlibdir}. 다른 스위치는 표준을 따릅니다.설치 설명서

구성 단계가 원활하게 진행되었습니다. 다음 오류로 인해 make 단계가 실패합니다.

make[2]: Entering directory `<the source directory>/hdf5-1.8.18/c++/src'
CXX      H5Exception.lo
H5Exception.cpp:16:18: fatal error: string: No such file or directory
#include <string>
                ^
compilation terminated

내가 올바르게 이해했다면 일부 헤더 파일이 누락되었으며 기본적인 성격을 띠고 있습니다.

  • 어디서 받아야 하나요?
  • 환경변수의 이름과 값에 결함이 있나요?

StackExchange에는 많은 내용이 포함되어 있습니다.이 오류에 대한 게시물, 하지만 대부분 코딩 연습과 관련이 있는 것 같습니다. 내 목표는 코드를 편집하는 것이 아니라 내 스톡 gcc 6.3.0을 사용하여 소스 코드를 성공적으로 컴파일하는 것입니다.

업데이트된 질문

아래의 유용한 의견과 Thomas Dickey의 답변을 바탕으로 유망한 방법은 libstdc++일치하는 버전의 gcc. 여기저기 검색해 봤는데GCC 웹사이트gcc다음 스위치를 사용하여 구성할 수 있는 것으로 보입니다.

--enable-version-specific-runtime-libs

libdir/gcc런타임 라이브러리가 일반적인 위치 대신 컴파일러별 하위 디렉터리( )에 설치되어야 함을 지정합니다 .또한 다음을 사용하여 재정의하지 않는 한 libstdc++포함 파일이 설치됩니다.libdir--with-gxx-include-dir=dirname이 옵션을 사용하는 것은 여러 버전의 GCC를 병렬로 사용하려는 경우 특히 유용합니다. 현재 이 기능 libgfortranlibstdc++, 및 에서 지원됩니다 libobjc.

  • 이것이 올바른 방향을 가리키는가?
  • 이 스위치를 사용하지 않는 경우 gcc 소스와 함께 배포된 libstdc++ 포함 파일을 어디에서 찾아야 합니까?

답변1

일반적으로 libstdc++(패키지 이름의 일부로 버전 및 "-dev" 또는 "-devel" 포함)와 같은 개발 패키지의 일부인 C++ 헤더 파일을 찾습니다.

예를 들어, Debian(Ubuntu는 대부분의 패키지를 가져옴)의 Debian 7 시스템에 다음 파일이 포함된 "libstdc++6-4.6-dev"가 있습니다.

/usr/include/c++/4.6/string

이것C헤더 파일에는.h접미사;C++일반적으로 그렇지 않습니다(일부 시스템에서는 볼 수 있지만.hh).

추가 컴파일러를 구성할 때 사용하는 설정(로그 참조...)을 통해 라이브러리를 찾을 수 있는 위치를 알 수 있습니다. 최신 컴파일러와 호환되도록 자체 libstdc++를 빌드해야 할 수도 있습니다. 다시 말하지만, --prefix컴파일러와 라이브러리가 함께 작동하려면 구성할 때 옵션을 설정 해야 합니다 .

후속 질문을 해결하려면: 컴파일러가 에서 찾고 있는 경우 변수를 수정하고 추가하여 /usr/local이 문제를 해결할 수 있습니다(라이브러리 경로도 고려해야 하지만). libstdc++ 패키지에서 사용되는 경로 이름을 보려면 다음을 사용하십시오.CPPFLAGS/usr/include/usr/include/c++/4.8LDFLAGS

dpkg -L $(dpkg -l | awk '{print $2}' |grep -E 'libstdc++.*dev')

답변2

문제를 해결하는 한 가지 방법이 있습니다. 감사합니다토마스 디키의 답변왜냐하면 그것이 나를 올바른 방향으로 이끌었기 때문이다.

질문

문제는 사용자 정의 설치 컴파일러 gcc 6.3.0이 libstdc++Ubuntu 배포판에 포함된 일련의 파일을 찾을 수 없다는 것입니다./usr/include/

이유

설치되면 gcc 6.3.0의 자체 구성 파일은 대상 디렉터리에서 로컬(이전에 설치된) 헤더 파일을 찾는 기본 사양을 자동으로 따릅니다. 이에 대한 기본값은 입니다 /usr/local/include/.https://gcc.gnu.org/install/configure.html더 알아보기.

고정시키다

다시 설치된 컴파일러는 ./configure --with-local-prefix=/usrUbuntu가 저장한 필수 파일을 얻을 수 있는 새로운 gcc를 생성했습니다. CPPFLAGS질문에 표시된 내용을 더 이상 조정할 필요가 없습니다. 그러나 --with-local-prefix=/usr이 설정은 권장되지 않습니다(참조:https://unix.stackexchange.com/a/348868/132913) 이것이 해결 방법입니다.

확인하다

이 전략에 대한 경험적 테스트는 makeHDF 1.8.18이 한때 어려움을 겪었던 부분에서 발전했다는 것입니다. 모든 테스트가 make check성공적으로 통과되었습니다.

대안

내가 발견한 (아직) 탐색한 새 라이브러리를 설치하는 또 다른 방법은 특히 gcc(switch ) libstdc++의 사용자 정의 설치를 위한 것입니다 . --enable-version-specific-runtime-libs나는 단서를 찾기 위해 위의 질문 프레임에 이 가능성을 설정했습니다. 이는 아마도 보다 강력한 솔루션일 것입니다. 이 스레드는 현재 열려 있습니다. 귀하의 기여/수정에 감사드립니다.

관련 정보