【问题标题】:program linking fails when using custom built gcc使用自定义构建的 gcc 时程序链接失败
【发布时间】:2015-03-24 10:57:10
【问题描述】:

我正在运行一个 Fedora 21 发行版,其中默认的 gcc 是 4.9。 我在 /usr/local/gcc48 中有一个定制的 gcc/g++ 4.8(例如,cuda 需要 gcc =

现在,我得到了一个使用 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

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

这里有什么问题?

谢谢

【问题讨论】:

    标签: c++ gcc linker


    【解决方案1】:

    __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.1 与 GCC 4.8 或更早版本的 libstdc++.solibsupc++.so 链接。要么使用 GCC 4.8 重建 libvtkCommonDataModel.so,要么链接到正确的 libstdc++.so。

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

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

    2. 链接 stdc++compat.cpp 包含来自 Mozilla 的反向兼容黑客。您还可以查看我的modified version,它不依赖于任何 Mozilla 标头,但它有点过时了。 特别是,它定义了一个存根__cxa_throw_bad_array_new_length

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-02-17
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-24
        相关资源
        最近更新 更多