将静态库链接到共享库

roh*_*san 3 linux gcc g++

我正在尝试在 Ubuntu Linux 上使用 g++ 5.4.0 创建一个共享库。

我已经构建了 Poco C++ 库的静态库(.a 文件),我想将它们静态链接到我的共享库中。

但它不起作用。

我已将以下字符串添加到我的构建脚本中:

-Wl,-whole-archive -lPocoFoundation -Wl,-no-whole-archive
Run Code Online (Sandbox Code Playgroud)

g++ 抱怨以下错误消息:

relocation R_X86_64_32S against '-ZTVN4Poco15ArchiveStrategyE' can not be used when making a shared object; recompile with -fPIC
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

dat*_*olf 5

执行编译器建议的操作:重新编译-fPIC

说明:共享对象要求其代码中的地址不依赖于地址空间中二进制图像的内存布局。静态链接的代码不受此约束,虚拟地址空间中的所有地址在链接时都是已知的,因此代码不需要处理在编译时未确定的位置。

-fPIC编译器标志使编译P ositionndependent Ç ODE(PIC)。您尝试链接的静态库未编译为 PIC,这就是链接器抱怨的原因。解决方案是重新编译静态库并启用 PIC。


附带说明:PIC 也是地址空间布局随机化 (ASLR) 的基础,ASLR 是一种安全措施,其目标是使漏洞程序的利用更加困难。