使用自定义构建的 gcc 时程序链接失败
我正在运行一个 Fedora 21 发行版,其中默认的 gcc 是 4.9.我在/usr/local/gcc48 中有一个定制的 gcc/g++ 4.8(例如,cuda 需要 gcc =< 4.8,我使用 update-alternatives 来选择这个)到目前为止,我一直在用这个 4.8 版本编译一些小程序,没有问题.
I'm running a fedora 21 distribution, in which the default gcc is 4.9. I have a custom built gcc/g++ 4.8 in /usr/local/gcc48 (for instance, cuda requires gcc =< 4.8, and i use update-alternatives to chose this one) I have been compiling a few small programs with this version 4.8 without problem so far.
现在,我得到了一个使用 vtk 库和其他库的源代码.如果我使用默认的 gcc 4.9,cmake 并使其正常工作.但是,当使用 gcc48 时,我得到:
Now, I have been given a source code which makes uses of vtk libraries and others. If I use default gcc 4.9, cmake and make work fine. However, when using gcc48, I get:
/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
我知道这是链接器错误,我试图指向 LD_LIBRARY_PATH=/usr/local/gcc48/lib 或 LD_LIBRARY_PATH=/usr/local/gcc48/lib64,但我卡住了.
I understand that is it a linker error, I tried to point LD_LIBRARY_PATH=/usr/local/gcc48/lib or LD_LIBRARY_PATH=/usr/local/gcc48/lib64, but i'm stuck.
这里有什么问题?
谢谢
推荐答案
__cxa_throw_bad_array_new_length
在 GCC 4.9 中添加.这就是 @CXXABI_1.3.8 版本后缀的含义.您可以在此处查找这些版本代码:https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
__cxa_throw_bad_array_new_length
was added in GCC 4.9. That's what the @CXXABI_1.3.8 version suffix means. You can look up those version codes here:
https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
此错误表示您正在尝试将由 GCC 4.9 或更高版本编译的目标文件 /usr/lib64/vtk/libvtkCommonDataModel.so.1
与 libstdc++.so
或 libsupc++.so
来自 GCC 4.8 或更早版本.使用 GCC 4.8 重新构建 libvtkCommonDataModel.so
,或者链接到正确的 libstdc++.so.
This error means that you are trying to link an object file /usr/lib64/vtk/libvtkCommonDataModel.so.1
compiled by GCC 4.9 or later with libstdc++.so
or libsupc++.so
from GCC 4.8 or earlier. Either rebuild libvtkCommonDataModel.so
with GCC 4.8, or link against the correct libstdc++.so.
实际上,如果您想使用较新版本的 GCC 进行编译,但使用较旧的 libstdc++.so 运行,则可以这样做.
Actually, if you want to compile with a newer version of GCC but run with an older libstdc++.so, that can be done.
如果您想使用 GCC 5+ 编译并使用旧 GCC 的 libstdc++.so 运行,请使用
-D_GLIBCXX_USE_CXX11_ABI=0
编译.请参阅 https://bugzilla.mozilla.org/show_bug.cgi?id=1153109 和 使用双 ABI 在 libstdc++ 手册中.
Compile with
-D_GLIBCXX_USE_CXX11_ABI=0
if you want to compile with GCC 5+ and run with libstdc++.so from older GCC. See https://bugzilla.mozilla.org/show_bug.cgi?id=1153109 and Using dual ABI in the libstdc++ manual.
链接到 stdc++compat.cpp 包含来自 Mozilla 的反向兼容黑客.你也可以看看我的 修改版,它不依赖于任何 Mozilla 头文件,但它有点过时了.特别是,它定义了一个存根 __cxa_throw_bad_array_new_length
.
Link against stdc++compat.cpp containing back-compat hacks from Mozilla. You can also take a look at my modified version which doesn't depend on any Mozilla headers, but it's slightly out of date.
In particular, this defines a stub __cxa_throw_bad_array_new_length
.
相关文章