加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:47:29 所属栏目:百科 来源:网络整理
导读:我所在的团队生成一个用于 Python的共享库.这个库完全是C,我们使用Boost来暴露给python.因为我们不能保证我们的客户端安装了Boost库,所以我们将Boost所需的功能从静态方面提升到共享对象文件.编译的最后阶段对许多人来说将会很熟悉 g++ -o output objects -W
我所在的团队生成一个用于 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即使是它构建的静态库呢?

解决方法

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

这对我有帮助1.46.1:

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

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

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

参考链接:

> https://cmake.org/Wiki/TubeTK/Build_Instructions#Boost_.28optional.29
> http://lists.boost.org/boost-users/2010/07/60682.php

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读