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

时间:2011-08-16 15:33:38

标签: c++ compiler-construction compiler-errors

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

当我尝试创建共享对象时,我收到错误... libstdc ++。a(ios)将R_x86_64_325重新定位为'vtable for std :: ios_base':在制作共享对象时不能使用

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

2 个答案:

答案 0 :(得分:3)

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

您的选择是:

  • 动态链接你的.so到libstdc ++(因此取决于系统中安装的.so文件)
  • 为libstdc ++构建.o文件并使用-fPIC编译它们然后从那些.so文件中编译(如果直接使用.o文件或ar存档则无关紧要)

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

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

答案 1 :(得分:0)

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