2016-12-08 38 views
1

我们手动科学的Linux机器上安装了GCC 6.2.0未定义的引用。一个C++应用程序的编译似乎不错,但我们在链接时CXX11与GCC 6.2.0

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

获得大量的undefined references到CXX11我们意识到double ABI issue,但与-D_GLIBCXX_USE_CXX11_ABI=0编译没什么区别。我们还有什么其他选择?

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)

+0

*您如何链接您的程序?用'ld'?用'gcc'?用'g ++'? –

+0

删除目标文件并重新编译。 –

+3

在安装gcc时,gcc更愿意假设它的库将被安装到/ usr/lib(64)?中,而不管你真的在哪里推送gcc。因此,您的代码最终会与系统的标准库链接。不幸的是,我忘记了如何从gcc的配置中剔除糟糕的细节,以便正确设置它以便与安装它们的库链接。你必须弄清楚,就像我在10年前做的那样......如果我记得所有这些,我会发布一个答案。 –

回答

0

我不明白为什么你的对象仍然有std::__cxx11::list引用,当你用-D_GLIBCXX_USE_CXX11ABI=0编译,除非宏则是在头文件/源文件中重新定义。您应该确保file.o对象正确地放入任何存档应该包含它(并且任何旧版本肯定已经消失)。随着中说:

您可能需要对链接的libstdc自带的GCC 6.2.0,不与貌似对应到一个较早的编译器,库的系统版本++库。

这可能需要使用-nostdlib然后手动添加-L/(path)/gcc-6.2.0/lib -lstdc++ -lc或相似。

或者,也可以是能够使用系统C++头文件,而不是在gcc 6.2.0头进行编译。那么你也应该能够成功地链接到系统的libstdC++库。在这种情况下,您需要-nostdinc++,然后-I/usr/include/c++/5(例如)。请注意,在这种情况下,-D_GLIBCXX_USE_CXX11_ABI=0将不起作用且不必要;旧图书馆没有双ABI。

+2

'gcc'在自己的安装中搜索'libstdC++',而不是在系统位置(我总是将gcc安装到非标准的位置)。 –

+0

@ n.m。然而,在这种情况下显然不这样做。 – davmac

+0

事实是,gcc默认是这样做的。在这种情况下,我们对一些未知的现象有一些间接的观察。从这里到明确建立任何东西都是漫长的道路。直到最详细的构建日志发布为止。 –