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

how to force compilation of Boost to use -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)并进行我自己的构建。毕竟,这一直对我们有用。我遵循 instructions here 但我得到了同样的错误。我如何强制对它构建的静态库使用 -fPIC?

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

这在 boost 1.46.1 上对我有用:

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

... 是您添加其他标志的地方,例如 threading=multi--layout=tagged,以及可选的要构建的项目列表(例如:--with-regex)。

注意:cflagscxxflags是不必要的,只需要一个即可。请参阅下面的评论。

参考链接:

为了方便,我结合了之前的回答和评论:

sudo ./bjam cxxflags=-fPIC -a --with-system install

--with-system 不是必需的,但它是一个可以添加其他 boost 编译选项的地方

我在 CentOS 7 上使用 boost 1.67

另一个解决方案:

./bootstrap.sh
./b2 cxxflags=-fPIC cflags=-fPIC