gpt4 book ai didi

c++ - g++ 尝试(失败)为共享对象静态链接到 libstdc++

转载 作者:太空狗 更新时间:2023-10-29 21:28:22 28 4
gpt4 key购买 nike

我正在尝试使用一些通过 -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++。

最佳答案

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

您的选择是:

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

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

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

关于c++ - g++ 尝试(失败)为共享对象静态链接到 libstdc++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7080831/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com