2017-01-09 118 views
3

我试图使用g ++静态库(staticLib.a)链接到使用动态库(dynamicLib.so):克++链接静态库成一个动态库(不-fPIC)

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

而我得到了相同的错误here

/usr/bin/ld: staticLib.a(object.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC staticLib.a(object.o): error adding symbols: Bad value collect2: error: ld returned 1 exit status

我看了几个主题,但我无法找到我要找的答案。 staticLib.a未被编译为位置无关代码(PIC)。根据link above,这似乎是强制性的。但是,staticLib.a是另一个我无法控制的项目的库。

我的第一个想法是提取对象*.o using ar -x(如解释in this second link)。但问题依然如此,因为该对象未编译为-fPIC

我的第二个想法是创建我自己的Makefile以在我的项目中使用-fPIC重新编译staticLib.a(我不想搞乱现有的项目)。但我不知道这是一个好办法...

所以我的问题是以下几点:有没有任何可能的方式链接静态库(编译没有-fPIC)到一个动态的?

相关主题:

回答

2

So my question is the following: Is there any possible way to link a static library (compiled without -fPIC) into a dynamic one ?

作为提供与位置无关的代码需要编译没有实际这是不可能改变已经编译的代码。从理论上说,你可能会从二进制源代码中逆向工程并重新编译,但这将是完全无效的解决方案。所以你必须(重新)编译通过-fPIC的原始项目。

+0

这是我害怕。谢谢回复。 – Nicolas