作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在 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
有人可以帮忙吗?
最佳答案
按照编译器的建议执行:使用 -fPIC
重新编译
说明:共享对象有要求,它们代码中的地址不依赖于二进制图像在地址空间中的内存布局。静态链接代码不受此约束,虚拟地址空间中的所有地址在链接时都是已知的,因此代码不需要处理编译时未确定的位置。
-fPIC
编译器标志允许编译P位置独立独立Code (PIC)。您尝试链接的静态库未编译为 PIC,这就是链接器提示的原因。解决方案是重新编译启用 PIC 的静态库。
附带说明:PIC 也是地址空间布局随机化 (ASLR) 的基础,ASLR 是一种安全措施,旨在使易受攻击的程序的利用变得更加困难。
关于linux - 将静态库链接到共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38531837/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!