2011-08-16 61 views
3

我试图创建一个使用-fPIC命令创建的一些.O文件的共享对象。当我使用-shared参数运行g ++时,它似乎试图静态链接到libstdC++。库,这当然会失败。我试图弄清楚为什么当我不使用-static-stdC++参数时,它会自动尝试静态链接。 。创建共享目标g ++试图(失败)静态链接到libstdC++共享对象

我跑的时候不能用:当我尝试创建共享对象我得到的错误...的libstdC++一(IOS)搬迁R_x86_64_325反对“虚函数表为标准::的ios_base”

G ++与-V参数并收到并可以看到LD收到参数-lstdC++。

+0

尝试gcc -lstdC++ ...其他选项。结果会是什么? – ks1322

+0

不应该是这种情况。 [适用于其他人。](http://stackoverflow.com/questions/2001141/why-doesnt-g-link-with-the-dynamic-library-i-create)。 GCC版本?命令输入/输出? –

+1

在'strace -ffo trace.log g ++ ...'下运行它,然后在'libstdc'上运行grep'trace.log *'来查看它在哪里选择'.a'版本以及它是否首先尝试'.so' 。 –

回答

3

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

的选项有:

  • 动态的。所以链接到的libstdC++(因此它取决于安装在系统中的.so文件使)
  • 构建的.o的文件的libstdC++和用-fPIC编译它们,然后从那些你的.so文件中编译(这里直接使用.o文件或ar存档并不重要)

对于第一个(我会推荐)选项如下就足够了(它来自我用来创建mall的makefile OC /免费拦截.so文件)

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

无视你似乎在回答其他问题的事实,有一个链接模式称为“部分链接”,由'ld'的'-r'选项激活 - 共享库中的共享库。 –

0

我敢打赌,它首先找到静态库在其库搜索路径,或仅找到静态库。确保已安装并可找到适当版本的共享版本。你可以用g ++运行truss来追踪它的开放库的顺序。