我正在尝试在Ubuntu Linux上使用g ++ 5.4.0创建一个共享库。
我已经构建了Poco C ++库的静态库(.a文件),我想将它们静态链接到我的共享库中。
但它没有用。
我已将以下字符串添加到构建脚本中:
-Wl,-whole-archive -lPocoFoundation -Wl,-no-whole-archive
g ++抱怨以下错误消息:
relocation R_X86_64_32S against '-ZTVN4Poco15ArchiveStrategyE' can not be used when making a shared object; recompile with -fPIC
有人可以帮忙吗?
答案 0 :(得分:4)
执行编译器建议: 使用-fPIC
重新编译
说明:共享对象要求其代码中的地址不依赖于地址空间中二进制映像的内存布局。静态链接代码不受此约束,虚拟地址空间中的所有地址在链接时都是已知的,因此代码不需要处理在编译时未确定的位置。
-fPIC
编译器标志可以编译 P I 独立 C ode(PIC)。您尝试链接的静态库未编译为PIC,这就是链接器抱怨的原因。解决方案是在启用PIC的情况下重新编译静态库。
旁注:PIC也是地址空间布局随机化(ASLR)的基础,ASLR是一项安全措施,其目标是使对易受攻击的程序的利用更加困难。