【问题标题】:g++ linking a static library into a dynamic library (without -fPIC)g ++将静态库链接到动态库(没有-fPIC)
【发布时间】:2017-05-24 07:47:39
【问题描述】:

我正在尝试使用 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)。根据link above,这似乎是强制性的。但是,staticLib.a 是来自另一个项目的库,我无法控制。

我的第一个想法是提取对象*.o usingar -x(如in this second link 所述)。但是问题仍然存在,因为对象没有使用-fPIC 编译。

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

所以我的问题如下:有没有办法将静态库(没有-fPIC 编译)链接到动态库?

相关主题:

【问题讨论】:

    标签: c++ g++ static-linking dynamic-linking


    【解决方案1】:

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

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

    【讨论】:

    • 那是我所担心的。感谢您的回复。
    • 我也害怕,因为我用 boost
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多