【问题标题】:How to link with libstdc++_pic.a with GCC?如何使用 GCC 与 libstdc++_pic.a 链接?
【发布时间】:2015-02-18 20:47:04
【问题描述】:

我的系统上有一个 libstdc++_pic.a(Ubuntu 12.04,gcc 4.6.3),大概这是使用 -fPIC 创建的 libstdc++ 版本。我也有一个 libstdc++.a。

当我尝试通过 -static-libstdc++ 链接标志将 libstdc++ 与共享库静态链接时,我看到以下错误:

:-1: error: /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.a(functexcept.o): relocation R_X86_64_32 against `std::bad_exception::~bad_exception()' can not be used when making a shared object; recompile with -fPIC

所以我假设它使用的是非图片版本,正如我所期望的基于默认命名的那样。如何指示链接器使用 libstdc++_pic.a 文件?

更新 1 _pic 版本位于/usr/lib/gcc/x86_64-linux-gnu/4.6/32 的 32 位 gcc 子文件夹中,而我在 64 位版本所在的父文件夹中看不到 _pic 版本。看来我的 gcc 版本不是用 64 位 PIC 静态 libstdc++.a 编译的。

更新 2 通过检查我的 gcc 版本然后安装包,我能够安装 64 位版本的 libstdc++_pic.a:

gcc --version gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 sudo apt-get install libstdc++6-4.6-pic

现在我在/usr/lib/gcc/x86_64-linux-gnu/4.6/ 中看到了它。仍然需要弄清楚如何告诉链接器使用它。

【问题讨论】:

    标签: linker shared-libraries static-libraries libstdc++


    【解决方案1】:

    我似乎通过传递 -nostdlib 链接器选项解决了这个问题,然后显式链接 libstdc++_pic。

    但是,现在我收到以下错误:

    version node not found for symbol std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_move(wchar_t*, wchar_t const*, unsigned long)@@GLIBCXX_3.4.5

    经过研究,似乎静态 libstdc++ 64bit with pic 可能存在错误,现在在较新版本的 gcc (4.7.3) 中已解决。 This other question有更多信息:

    Compiling one shared library on Linux to target all distributions

    【讨论】:

    • 后续:我在 Ubuntu 12.04 上安装并切换到 gcc 4.7.3(通过测试工具链存储库),我的程序现在链接并成功运行,我可以看到 libstdc++ 是静态链接的到共享库。我不再需要使用 libstdc++_pic 库,因为默认的库显然是可重定位的(-static-libstdc++ 就足够了)。
    猜你喜欢
    • 2018-08-20
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多