如何强制编译Boost使用-fPIC

时间:2015-01-08 19:31:42

标签: c++ boost

我工作的团队生成一个用于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

好吧,我以为我只需下载最新版本(CentOS 7安装Boost 1.53)并自行构建。毕竟,这一直对我们有用。我按照instructions here但我得到了同样的错误。如何强制使用-fPIC来构建它构建的静态库?

2 个答案:

答案 0 :(得分:16)

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

这对我来说有助于提升1.46.1:

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

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

注意:我不确定cflags是否必要,但似乎没有受到伤害。

参考链接:

答案 1 :(得分:0)

为方便起见,我结合了先前的答案和评论:

[{"name":"foobar","year":1986},{"name":"testtest","year":777}]

-无需使用系统,但可以在其中添加其他boost编译选项

它在CentOS 7上对我有效,增强了1.67