如何强制编译Boost使用-fPIC

问题描述 投票:14回答:2

我工作的团队生成一个用于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来构建它构建的静态库?

c++ boost
2个回答
17
投票

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

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

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

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

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

参考链接:


0
投票

为方便起见,我将之前的回答和评论结合起来:

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

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

它在CentOS 7上适用于我,增强1.67

© www.soinside.com 2019 - 2024. All rights reserved.