GCC 6.2.0 的 CXX11 未定义引用
CXX11 undefined references with GCC 6.2.0
我们已经在 Scientific Linux 机器上手动安装了 GCC 6.2.0。 C++ 应用程序的编译看起来不错,但我们在链接时
得到了很多 undefined references
到 CXX11
file.cpp:(.text+0x16cb): undefined reference to `std::__cxx11::list<void*, std::allocator<void*> >::list(std::__cxx11::list<void*, std::allocator<void*> > const&)'
我们知道 double ABI issue 但用 -D_GLIBCXX_USE_CXX11_ABI=0
编译没有区别。我们还有哪些其他选择?
更新
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) 构建
我不明白为什么你的对象在用 -D_GLIBCXX_USE_CXX11ABI=0
编译后仍然引用 std::__cxx11::list
,除非在 header/source 文件中重新定义宏。您应该确保 file.o
对象被正确地放入任何应该包含它的存档中(并且任何旧版本肯定已经消失)。话虽如此:
您可能需要 link 针对 gcc 6.2.0 附带的 libstdc++ 库,而不是该库的系统版本,它似乎对应于较早的编译器。
这可能需要使用 -nostdlib
,然后手动添加 -L/(path)/gcc-6.2.0/lib -lstdc++ -lc
或类似内容。
或者,您可以使用系统 C++ 头文件而不是 gcc 6.2.0 头文件进行编译。那么你应该也可以成功link针对系统libstdc++库。在那种情况下,您需要 -nostdinc++
然后 -I/usr/include/c++/5
(例如)。请注意,在这种情况下,-D_GLIBCXX_USE_CXX11_ABI=0
将无效并且是不必要的;旧库没有双 ABI。
我们已经在 Scientific Linux 机器上手动安装了 GCC 6.2.0。 C++ 应用程序的编译看起来不错,但我们在链接时
得到了很多undefined references
到 CXX11
file.cpp:(.text+0x16cb): undefined reference to `std::__cxx11::list<void*, std::allocator<void*> >::list(std::__cxx11::list<void*, std::allocator<void*> > const&)'
我们知道 double ABI issue 但用 -D_GLIBCXX_USE_CXX11_ABI=0
编译没有区别。我们还有哪些其他选择?
更新
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) 构建
我不明白为什么你的对象在用 -D_GLIBCXX_USE_CXX11ABI=0
编译后仍然引用 std::__cxx11::list
,除非在 header/source 文件中重新定义宏。您应该确保 file.o
对象被正确地放入任何应该包含它的存档中(并且任何旧版本肯定已经消失)。话虽如此:
您可能需要 link 针对 gcc 6.2.0 附带的 libstdc++ 库,而不是该库的系统版本,它似乎对应于较早的编译器。
这可能需要使用 -nostdlib
,然后手动添加 -L/(path)/gcc-6.2.0/lib -lstdc++ -lc
或类似内容。
或者,您可以使用系统 C++ 头文件而不是 gcc 6.2.0 头文件进行编译。那么你应该也可以成功link针对系统libstdc++库。在那种情况下,您需要 -nostdinc++
然后 -I/usr/include/c++/5
(例如)。请注意,在这种情况下,-D_GLIBCXX_USE_CXX11_ABI=0
将无效并且是不必要的;旧库没有双 ABI。