g++将静态库链接到动态库(不带-fPIC)

g++ linking a static library into a dynamic library (without -fPIC)

本文关键字:不带 -fPIC 动态 静态 链接 g++      更新时间:2023-10-16

我正试图使用将g++静态库(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):添加符号时出错:错误的值集合2:错误:ld返回1退出状态

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

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

我的第二个想法是创建我自己的Makefile,在我的项目中用-fPIC重新编译staticLib.a(我不想把现有的项目搞砸)。但我不确定这是一个好方法…

因此,我的问题如下:有没有任何可能的方法将静态库(在没有-fPIC的情况下编译)链接到动态库

相关主题:

  • 我可以通过链接静态库来构建共享库吗?

  • 将静态库链接到共享库

  • 如何在gcc-中将静态库链接到动态库

  • "重新定位R_ X86_64_32S对抗";链接错误

所以我的问题如下:有没有任何可能的方法将静态库(在没有-fPIC的情况下编译)链接到动态库?

由于提供与位置无关的代码需要编译,因此实际上不可能更改已编译的代码。从理论上讲,您可以从二进制代码中反向工程源代码并重新编译,但这将是完全无效的解决方案。所以您必须(重新)编译传递了-fPIC的原始项目。