【问题标题】:LD: Linking a shared library to a static libraryLD:将共享库链接到静态库
【发布时间】:2017-12-15 10:28:38
【问题描述】:

我正在尝试将static libraryshared library 链接起来,这会抛出一个错误,说recompile with -fPIC

这是我尝试使用的示例:

savari@Ramana:~/Junk$ cat common.h 
#include <stdio.h>
#include <stdlib.h>

void func1(int *p);
void func2();

共享库代码:

savari@Ramana:~/Junk$ cat shared.c 
#include "common.h"

void func2()
{
    int i=10;
    func1(&i);
}

以及静态库代码:

#include "common.h"

int k;

void func1(int *p)
{
    printf("%d\n", *p);
}

现在,看到共享库使用了静态库的API。

我是这样编译的:

gcc -c static.c

ar rcs libStatic.a static.o

gcc -c shared.c

gcc -shared -fPIC -o libShared.so shared.o  -L. -lStatic

在最后一条命令之后,我得到以下错误:

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

我实际上从供应商那里得到了static library,我正在尝试在它之上构建一个shared library。我没有静态库的来源。

我收到其他类型的错误提示:

relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
error adding symbols: Bad value
collect2: error: ld returned 1 exit status

我浏览了很多文章,但无法弄清楚。请帮我解决这个问题。

参考资料:

Reference-1

Reference-2

【问题讨论】:

    标签: c gcc ld


    【解决方案1】:

    在上面的示例中,您需要在为静态库编译目标文件时使用-fPIC。如果您省略此选项,则编译后的代码将无法包装到共享对象中。如果您只有静态库而没有源代码,那么您将无能为力。请库的创建者为您提供启用-fPIC 的编译。

    【讨论】:

    • 我们可以将-fPIC 用于静态库吗?无论如何,我尝试使用 -fPIC,就像在 gcc -c static.c -fPIC 中一样,它会抛出相同的错误
    • 您需要使用-fPIC 编译属于lib 的所有对象。所以也将它添加到 shared.c 中。您是否使用更新的对象重新创建了 .a
    【解决方案2】:

    试试这个静态链接 libStatic.a:

    gcc -shared -fPIC -o libShared.so shared.o  -L. -Wl, -Bstatic -lStatic
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多