如何强制编译 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
)。
注意:cflags
和cxxflags
是不必要的,只需要一个即可。请参阅下面的评论。
参考链接:
为了方便,我结合了之前的回答和评论:
sudo ./bjam cxxflags=-fPIC -a --with-system install
--with-system 不是必需的,但它是一个可以添加其他 boost 编译选项的地方
我在 CentOS 7 上使用 boost 1.67
另一个解决方案:
./bootstrap.sh
./b2 cxxflags=-fPIC cflags=-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
)。
注意:cflags
和cxxflags
是不必要的,只需要一个即可。请参阅下面的评论。
参考链接:
为了方便,我结合了之前的回答和评论:
sudo ./bjam cxxflags=-fPIC -a --with-system install
--with-system 不是必需的,但它是一个可以添加其他 boost 编译选项的地方
我在 CentOS 7 上使用 boost 1.67
另一个解决方案:
./bootstrap.sh
./b2 cxxflags=-fPIC cflags=-fPIC