我所在的团队制作了一个用于 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 许可协议
我相信boost会在编译共享库(.so文件)时自动使用
-fPIC
,但是下面的命令在编译静态库(.a文件)时也使用-fPIC
。这在 boost 1.46.1 上对我有用:
The
...
is where you add additional flags likethreading=multi
or--layout=tagged
, and optionally the list of projects to build (for example:--with-regex
)。注意:不需要同时使用
cflags
和cxxflags
,只需要一个。请参阅下面的评论。参考链接: