如何强制编译Boost使用-fPIC

And*_*nga 14 c++ boost

我工作的团队生成一个用于Python的共享库.这个库完全是C++,我们使用Boost来暴露给python.因为我们不能保证我们的客户端安装了Boost库,所以我们将Boost所需的功能静态地提供给共享对象文件.编译的最后阶段看起来很熟悉

g++ -o <output> <objects> -Wl,-Bstatic -lboost_python -lboost_regex ... -Wl,-Bdynamic -shared <other_opts>
Run Code Online (Sandbox Code Playgroud)

我们传统上使用自己构建的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
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*pit 17

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

这对我来说在1.46.1上有所帮助:

sudo ./bjam cxxflags=-fPIC cflags=-fPIC -a ... install
Run Code Online (Sandbox Code Playgroud)

...是你添加额外的标志像threading=multi或者--layout=tagged,以及可选的项目,以建立(例如:列表--with-regex).

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

参考链接: