我试图使用以下命令将g ++与静态库(staticLib.a)链接到动态库(dynamicLib.so):
g++ *.o -Wl,--whole-archive staticLib.a -Wl,--no-whole-archive -shared -o dynamicLib.so
我得到了与here相同的错误:
/ usr / bin / ld:staticLib.a(object.o):重定位R_X86_64_32 `.RODATA'制作共享对象时不能使用;重新编译 -fPIC staticLib.a(object.o):添加符号错误:错误值collect2:错误:ld返回1退出状态
我读了几个主题,但我找不到我要找的答案。 staticLib.a未编译为位置无关代码(PIC)。根据{{3}},它似乎是强制性的。但是,staticLib.a是来自另一个我无法控制的项目的库。
我的第一个想法是提取对象*.o using
ar -x(如link above所述)。但问题仍然是对象未使用-fPIC
进行编译。
我的第二个想法是创建我自己的Makefile,在我的项目中用-fPIC
重新编译staticLib.a(我不想弄乱现有的项目)。但我不确定这是一个好方法...
所以我的问题如下:有没有可能的方法将静态库(没有-fPIC
编译)链接到动态库?
相关主题:
答案 0 :(得分:2)
所以我的问题如下:有没有可能的方法将静态库(没有-fPIC编译)链接到动态库?
由于提供与位置无关的代码需要编译,实际上不可能更改已编译的代码。从理论上讲,您可以从二进制文件中反向设计源代码并重新编译,但这将是完全无效的解决方案。因此,您必须(重新)编译原始项目并传递-fPIC。