使用g++将静态库链接到动态库中(无需-fPIC)

5

我正在尝试使用以下方式将静态库(staticLib.a)链接到动态库(dynamicLib.so)中:

g++  *.o -Wl,--whole-archive staticLib.a -Wl,--no-whole-archive -shared -o dynamicLib.so

我遇到了与这里相同的错误:

/usr/bin/ld: staticLib.a(object.o): 重定位 R_X86_64_32 对`.rodata'无法在制作共享对象时使用; 重新编译使用 -fPIC staticLib.a(object.o): 错误添加符号: 值无效 collect2: error: ld 返回 1 exit status

我看了几个主题,但没有找到我想要的答案。staticLib.a没有编译为位置无关代码(PIC)。根据上面的链接,这似乎是强制性的。然而,staticLib.a是另一个项目的库,我无法控制。

我的第一个想法是使用ar -x提取对象*.o(如第二个链接中所述)。但问题仍然存在,因为该对象未使用-fPIC进行编译。

我的第二个想法是创建自己的Makefile,在项目中重新编译staticLib.a并加上-fPIC(我不想弄乱现有项目)。但我不确定这样做是否好...所以我的问题是:有没有可能将静态库(未使用-fPIC编译)链接到动态库中?相关主题:
1个回答

2
我的问题是:是否有可能将一个静态库(未使用-fPIC编译)链接到动态库中?由于提供位置无关代码需要编译,因此实际上不可能更改已编译的代码。理论上,您可以从二进制文件中反向工程源代码并重新编译,但这将是完全无效的解决方案。因此,您必须使用-fPIC重新编译原始项目。

那正是我担心的。谢谢回复。 - Nicolas
我也感到害怕,因为我使用boost。 - Jimmy Guo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接