我正在尝试使用-fPIC命令创建的许多.O文件创建共享对象。当我使用-shared参数运行g ++时,它似乎试图静态链接到libstdc ++。一个库,当然它失败了。我正在试图找出为什么当我不使用-static-stdc ++参数时它会自动尝试静态链接。
当我尝试创建共享对象时,我收到错误... libstdc ++。a(ios)将R_x86_64_325重新定位为'vtable for std :: ios_base':在制作共享对象时不能使用
我使用-V参数运行G ++并收到,并且可以看到LD接收参数-lstdc ++。
答案 0 :(得分:3)
将单个共享对象链接在一起时,需要从现有的.o文件中执行此操作。你不能从现有的.so文件中做到这一点;这会将这些.so文件链接到.so文件,但不会将链接到您的.so文件。所以gcc寻找并找到.o文件(.a)的存档并尝试链接它们。但由于这些不是为重定位而编译的(没有-fPIC),因此不能用于创建.so文件。
您的选择是:
对于第一个(我建议)选项,以下就足够了(它来自我用来创建malloc / free intercepting .so文件的makefile)
gcc -shared -lstdc++ -o your.so yourfiles.o
答案 1 :(得分:0)
我敢打赌,它首先在其库搜索路径中找到静态库,或者只找到静态库。确保已安装并找到相应版本的共享版本。您可以{g}运行truss
来查找它打开库的顺序。