2016-12-08 10 views
1

Scientific Linux 컴퓨터에 GCC 6.2.0을 수동으로 설치했습니다. 는 C++ 응용 프로그램의 컴파일은 잘 보이지만 우리는 우리가 double ABI issue 알고 있지만 -D_GLIBCXX_USE_CXX11_ABI=0로 컴파일하는 것은 차이가 없습니다 시간GCC 6.2.0과의 CXX11 정의되지 않은 참조

file.cpp:(.text+0x16cb): undefined reference to `std::__cxx11::list<void*, std::allocator<void*> >::list(std::__cxx11::list<void*, std::allocator<void*> > const&)' 

연결에 CXX11에 undefined references 많이 얻을. 어떤 다른 옵션이 있습니까?

UPDATE

CMAKE 구성은 다음과 같다 :

-- The C compiler identification is GNU 6.2.0 
-- The CXX compiler identification is GNU 6.2.0 
-- Check for working C compiler: /opt/GNU/gcc-6.2.0/bin/gcc 
-- Check for working C compiler: /opt/GNU/gcc-6.2.0/bin/gcc -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Check for working CXX compiler: /opt/GNU/gcc-6.2.0/bin/g++ 
-- Check for working CXX compiler: /opt/GNU/gcc-6.2.0/bin/g++ -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 

이 (실제로 실패) file.cpp

gcc-6.2.0/bin/g++ -O3 -fopenmp -DNO_HDF5 -D_GLIBCXX_USE_CXX11_ABI=0 -I./include -I/opt/mpich/3.2/include -o file.cpp.o -c file.cpp 

와 연결

컴파일 라인 인
gcc-6.2.0/bin/g++ -O3 -fopenmp -DNO_HDF5 -D_GLIBCXX_USE_CXX11_ABI=0  main.cpp.o -o ASTEP -rdynamic libMainASTEPlib.a -lhdf5_hl -lhdf5 -lz -lm -lhdf5_hl -lhdf5 -lz -lm /opt/mpich/3.2/lib/libmpicxx.so /opt/mpich/3.2/lib/libmpi.so -Wl,-rpath,/opt/mpich/3.2/lib 

또한, MPICH 3.2은 새로운 컴파일러 (GCC 6.2.0)로 구축 된

개체가 여전히 std::__cxx11::list에 대한 참조를 가지고 왜이 -D_GLIBCXX_USE_CXX11ABI=0 컴파일 때 매크로가있는 다음 경우를 제외하고 내가 이해하지 못하는
+0

* 귀하의 프로그램을 어떻게 연결하고 있습니까? 'ld'로? 'gcc'로? 'g ++ '로? –

+0

오브젝트 파일을 제거하고 다시 컴파일하십시오. –

+3

gcc를 설치할 때 gcc는 실제로 gcc를 밀어 넣는 위치와 상관없이 라이브러리가/usr/lib (64)에 설치 될 것이라고 가정합니다. 따라서 귀하의 코드는 시스템의 표준 라이브러리와 연결됩니다. 안타깝게도 gcc의 설정을 망치는 방법에 대한 자세한 내용을 잊어 버렸습니다. gcc를 설치 한 곳의 라이브러리와 올바르게 연결되도록 설정하는 것이 좋습니다. 10 년 전에했던 것처럼 당신은 그것을 알아 내야 할 것입니다 ... 만약 내가 그 모든 것을 기억한다면, 나는 대답을 게시 할 것입니다. –

답변

0

헤더/소스 파일에서 재정의. file.o 개체가 포함되어야하는 모든 보관 파일에 개체가 올바르게 배치되었는지 확인하고 모든 이전 버전이 확실히 없어 졌는지 확인해야합니다. 그 내용은 다음과 같습니다 :

gcc 6.2.0과 함께 제공되는 libstdC++ 라이브러리는 이전 컴파일러와 유사하게 보이는 시스템 버전이 아니라 링크해야 할 수 있습니다.

-nostdlib을 사용하고 수동으로 -L/(path)/gcc-6.2.0/lib -lstdc++ -lc 또는 그와 비슷한 것을 추가해야 할 수 있습니다.

또는 gcc 6.2.0 헤더 대신 시스템 C++ 헤더를 사용하여 컴파일 할 수도 있습니다. 그런 다음 시스템 libstdC++ 라이브러리와 성공적으로 연결할 수 있어야합니다. 이 경우 -nostdinc++을 입력 한 다음 -I/usr/include/c++/5 (예 :)을 입력하십시오. 이 경우 -D_GLIBCXX_USE_CXX11_ABI=0은 아무 효과가 없으며 불필요합니다. 오래된 도서관에는 이중 ABI가 없습니다.

+2

'gcc'는 시스템 장소가 아닌 자체 설치에서'libstdC++'을 검색합니다 (gcc를 비표준 장소에 항상 설치합니다). –

+0

@ n.m. 그러나이 경우 분명히 그렇게하지 않습니다. – davmac

+0

사실 gcc는 기본적으로 그렇게합니다. 이 경우 우리는 몇 가지 알려지지 않은 현상을 간접적으로 관찰합니다. 여기에서 명확하게 확립 된 긴 길입니다. 자세한 빌드가 될 때까지 우리는 최소한 게시했습니다. –