내 상황. 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를 병렬로 사용하려는 경우 특히 유용합니다. 현재 이 기능libgfortran
은libstdc++
, 및 에서 지원됩니다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.8
LDFLAGS
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=/usr
Ubuntu가 저장한 필수 파일을 얻을 수 있는 새로운 gcc를 생성했습니다. CPPFLAGS
질문에 표시된 내용을 더 이상 조정할 필요가 없습니다. 그러나 --with-local-prefix=/usr
이 설정은 권장되지 않습니다(참조:https://unix.stackexchange.com/a/348868/132913) 이것이 해결 방법입니다.
확인하다
이 전략에 대한 경험적 테스트는 make
HDF 1.8.18이 한때 어려움을 겪었던 부분에서 발전했다는 것입니다. 모든 테스트가 make check
성공적으로 통과되었습니다.
대안
내가 발견한 (아직) 탐색한 새 라이브러리를 설치하는 또 다른 방법은 특히 gcc(switch ) libstdc++
의 사용자 정의 설치를 위한 것입니다 . --enable-version-specific-runtime-libs
나는 단서를 찾기 위해 위의 질문 프레임에 이 가능성을 설정했습니다. 이는 아마도 보다 강력한 솔루션일 것입니다. 이 스레드는 현재 열려 있습니다. 귀하의 기여/수정에 감사드립니다.