使用-fPIC选项编译出protobuf静态库libprotobuf.a
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用-fPIC选项编译出protobuf静态库libprotobuf.a相关的知识,希望对你有一定的参考价值。
参考技术A 用的64位Ubuntu系统,开发一个共享库so使用到了protobuf,如果链接libprotobuf.so就需要一起打包带走,否则可能因protobuf版本较多出现版本不匹配的问题,所以需要它链接静态库libprotobuf.a,但是链接时候报错: relocation R_X86_64_32 against `a local symbol’ can not be used when making a shared object; recompile with -fPIC。如何使用boost.python中的-fPIC编译静态库
默认情况下,libboostpython.a
是在没有-fPIC
的情况下编译的。但我必须创建一个python扩展,它是一个动态库,其中-fPIC
链接到静态库。如何使用libboostpython.a
中的-fPIC
编译静态库(boost.python
)?
答案
您可以使用几种选项:
- 从源代码编译boost并将额外的编译器选项传递给bjam。例如。
bjam ... cxxflags='-fPIC'
。这会将每个boost源文件编译为与位置无关的代码。 - 以共享库的形式使用boost。在这种情况下,您可能希望将boost共享库与应用程序一起发布,以确保使用适当的boost版本。您可以将可执行文件与
'-Wl,-rpath,$ORIGIN'
标志链接,以便当动态链接器搜索可执行文件所需的共享库时,它会在可执行文件所在的目录中查找它们。有关man ld.so的更多详细信息,请参阅$ORIGIN
。
另一答案
请注意,如果您在首先需要清除目标后已经运行了bjam,那么通过应用-d + 2打印命令也很有帮助:
./bjam clean &&
./bjam -d+2 link=static cxxflags="-fPIC" install
以上是关于使用-fPIC选项编译出protobuf静态库libprotobuf.a的主要内容,如果未能解决你的问题,请参考以下文章