如何强制编译 Boost 以使用 -fPIC

新手上路,请多包涵

我所在的团队制作了一个用于 Python 的共享库。这个库完全是 C++,我们使用 Boost 来暴露给 python。因为我们不能保证我们的客户安装了 Boost 库,所以我们将 Boost 所需的功能静态地引入到共享对象文件中。编译的最后阶段对许多人来说看起来很熟悉

g++ -o <output> <objects> -Wl,-Bstatic -lboost_python -lboost_regex ... -Wl,-Bdynamic -shared <other_opts>

我们传统上使用我们自己构建的 Boost:1.47。这个版本现在已经很旧了,所以我们希望更新。然而,奇怪的是,当我在我的 CentOS 7 系统上使用 yum 安装必要的对象时,我从 gcc 收到以下错误:

 relocation R_X86_64_32 against '.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC

好吧,我想我只需下载最新的 boost(CentOS 7 安装 Boost 1.53)并自己构建。毕竟,这一直对我们有用。我按照 此处的说明 进行操作,但遇到了同样的错误。即使是它构建的静态库,我如何强制使用 -fPIC?

原文由 Andrew Falanga 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
1 个回答

我相信boost会在编译共享库(.so文件)时自动使用 -fPIC ,但是下面的命令在编译静态库(.a文件)时也使用 -fPIC

这在 boost 1.46.1 上对我有用:

 sudo ./bjam cxxflags=-fPIC cflags=-fPIC -a ... install

The ... is where you add additional flags like threading=multi or --layout=tagged , and optionally the list of projects to build (for example: --with-regex )。

注意:不需要同时使用 cflagscxxflags ,只需要一个。请参阅下面的评论。

参考链接:

原文由 Brad Cupit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题