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

标签 c++ gcc linker

我正在运行一个 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 和 make 可以正常工作。 但是,当使用 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

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

这里有什么问题?

谢谢

最佳答案

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

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

编辑: 实际上,如果您想使用较新版本的 GCC 进行编译但使用较旧的 libstdc++ 运行。那么,这是可以做到的。

  1. 如果您想使用 GCC 5+ 编译并使用旧版 GCC 中的 libstdc++.so 运行,请使用 -D_GLIBCXX_USE_CXX11_ABI=0 进行编译。参见 https://bugzilla.mozilla.org/show_bug.cgi?id=1153109Using dual ABI在 libstdc++ 手册中。

  2. 针对 stdc++compat.cpp 的链接包含来自 Mozilla 的反向兼容黑客。你也可以看看我的modified version它不依赖于任何 Mozilla header ,但它有点过时了。 特别是,这定义了一个 stub __cxa_throw_bad_array_new_length

关于c++ - 使用自定义构建的 gcc 时程序链接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29230777/

相关文章:

c++ - 析构函数的模板特化

gcc - 如何解决交叉编译中的crt0.o链接问题?

c - FreeBSD 上对 sbuf 函数的 undefined reference

c++ - 通过模板的监听器模式,如何在不指定模板参数的情况下使用模板类?由 小码哥发布于

c++ - 错误: 'make_array' 不是 'boost::serialization 的成员

c++ - 销毁 ALLEGRO_BITMAP* 的 vector

c++ - 标准如何定义运行时绑定(bind)数组的捕获?

c++ - 零参数的可变参数宏

c++ - g++ 找不到 .so 文件

ios - 您将如何追溯导入框架的来源?