g++ 尝试(失败)静态链接到 libstdc++ 以获取共享对象

Posted

技术标签:

【中文标题】g++ 尝试(失败)静态链接到 libstdc++ 以获取共享对象【英文标题】:g++ trying (failing) to link statically to libstdc++ for shared object 【发布时间】:2011-08-16 15:33:38 【问题描述】:

我正在尝试使用使用 -fPIC 命令创建的多个 .O 文件来创建共享对象。当我使用 -shared 参数运行 g++ 时,它似乎试图静态链接到 libstdc++.a 库,这当然会失败。我试图弄清楚为什么当我不使用 -static-stdc++ 参数时它会自动尝试静态链接。

当我尝试创建共享对象时,我收到错误...libstdc++.a(ios) relocate R_x86_64_325 against 'vtable for std::ios_base': cannot be used when making a shared object

我用 -V 参数运行 G++ 并收到,可以看到 LD 收到参数 -lstdc++。

【问题讨论】:

试试 gcc -lstdc++ ... 其他选项。结果会怎样? 不应该这样。 Works for other people.。海合会版本?命令输入/输出? strace -ffo trace.log g++ ... 下运行它,然后用grep trace.log* 查找libstdc 以查看它在哪里选择.a 版本以及它是否首先尝试.so 【参考方案1】:

将单个共享对象链接在一起时,您需要从现有的 .o 文件中执行此操作。您不能从现有的 .so 文件中执行此操作;这会将这些 .so 文件链接到您的 .so 文件,但不会将这些 .so 文件链接到您的 .so 文件中。因此 gcc 寻找并找到 .o 文件 (.a) 的存档并尝试链接它们。但由于这些不是为重定位而编译的(无 -fPIC),因此不能用于创建 .so 文件。

您的选择是:

将您的 .so 动态链接到 libstdc++(从而使其取决于系统中安装的 .so 文件) 为 libstdc++ 构建 .o 文件并使用 -fPIC 编译它们,然后从您的 .so 文件中编译(在这里,您是直接使用 .o 文件还是使用 ar 存档都没有关系)

对于第一个(我会推荐的)选项,以下就足够了(它来自我用于创建 malloc/free 拦截 .so 文件的 makefile)

gcc -shared -lstdc++ -o your.so yourfiles.o

【讨论】:

忽略您似乎在回答其他问题的事实,有一个名为partial linking 的链接模式由-r-r 选项激活ld - 共享库输入,共享库输出。 【参考方案2】:

我敢打赌它会首先在其库搜索路径中找到静态库,或者只查找静态库。确保已安装并可以找到共享版本的适当版本。您可能可以truss 您的 g++ 运行来寻找它打开库的顺序。

【讨论】:

以上是关于g++ 尝试(失败)静态链接到 libstdc++ 以获取共享对象的主要内容,如果未能解决你的问题,请参考以下文章

gcc:查找 libstdc++ 的目录

如何使用 PIC 编译 gnu libstdc++.a?

libstdc++ - 不使用 qmake 静态链接

libstdc++ 静态链接和 System V ABI

到 ATL 的静态链接总是失败

通过 g++ 链接到外部静态库