繁体   English   中英

LD:将共享库链接到静态库

[英]LD: Linking a shared library to a static library

我正在尝试将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

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

参考文献:

参考1

参考2

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM