使用自定义构建的gcc时程序链接失败

Nap*_*eis 4 c++ linker gcc

我正在运行fedora 21发行版,默认gcc为4.9.我在/ usr/local/gcc48中有一个自定义构建的gcc/g ++ 4.8(例如,cuda需要gcc = <4.8,我使用update-alternatives来选择这个)我一直用这个版本4.8编译一些小程序到目前为止没有问题.

现在,我获得了一个使用vtk库和其他库的源代码.如果我使用默认的gcc 4.9,cmake并使工作正常.但是,当使用gcc48时,我得到:

/usr/lib64/vtk/libvtkCommonDataModel.so.1: référence indéfinie vers « std::__throw_out_of_range_fmt(char const*, ...)@GLIBCXX_3.4.20 »
/lib64/libicuuc.so.52: référence indéfinie vers « __cxa_throw_bad_array_new_length@CXXABI_1.3.8 »
collect2: erreur: ld a retourné 1 code d'état d'exécution
CMakeFiles/main.dir/build.make:365: recipe for target '../bin/main'   failed
make[2]: *** [../bin/main] Error 1
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/main.dir/all' failed
make[1]: *** [CMakeFiles/main.dir/all] Error 2
Makefile:76: recipe for target 'all' failed
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)

我明白这是一个链接器错误,我试图指向LD_LIBRARY_PATH =/usr/local/gcc48/lib或LD_LIBRARY_PATH =/usr/local/gcc48/lib64,但我卡住了.

这里有什么问题 ?

谢谢

Ral*_*gen 8

__cxa_throw_bad_array_new_lengthGCC 4.9中添加.这就是@ CXXABI_1.3.8版本后缀的含义.您可以在此处查找这些版本代码:https: //gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html

此错误意味着你正在尝试链接的目标文件/usr/lib64/vtk/libvtkCommonDataModel.so.1由GCC 4.9编译或更高版本libstdc++.so或者libsupc++.so从GCC 4.8或更早版本.使用libvtkCommonDataModel.soGCC 4.8 重建,或者链接到正确的libstdc ++.所以.

编辑: 实际上,如果你想用较新版本的GCC进行编译,但是使用较旧的libstdc ++运行,那么就可以了.

  1. 与编译-D_GLIBCXX_USE_CXX11_ABI=0从旧GCC如果你想编译GCC 5+与++的libstdc运行.所以.请参阅libstdc ++手册中的https://bugzilla.mozilla.org/show_bug.cgi?id=1153109使用双ABI.

  2. 链接stdc ++ compat.cpp包含来自Mozilla的back-compat hacks.您还可以查看我的修改版本,该版本不依赖于任何Mozilla标头,但它稍微过时了.特别是,这定义了一个存根__cxa_throw_bad_array_new_length.


小智 4

如果您用英文发布错误消息,将会很有帮助。

看来未定义的符号是__cxa_throw_bad_array_new_length。这些函数__cxa...来自 C++ 运行时库。G++ 通常附带该库自己的版本,称为libsupc++. 我猜想定制的 G++ 找不到这个库,或者正在发出对不在较新版本 (4.9) 中的符号的引用libsupc++。尝试编译libsupc++您的自定义版本的 G++ 附带的源代码并将链接器指向它。您可能还需要为 执行此操作libstdc++