Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何强制编译Boost以使用-fPIC_C++_Boost - Fatal编程技术网

C++ 如何强制编译Boost以使用-fPIC

C++ 如何强制编译Boost以使用-fPIC,c++,boost,C++,Boost,我所在的团队生成了一个用于Python的共享库。这个库完全是C++,我们使用Boost来公开Python。因为我们不能保证我们的客户机安装了Boost库,所以我们静态地将Boost所需的功能拉入共享对象文件。编译的最后阶段对许多人来说都很熟悉 g++ -o <output> <objects> -Wl,-Bstatic -lboost_python -lboost_regex ... -Wl,-Bdynamic -shared <other_opts> 嗯,

我所在的团队生成了一个用于Python的共享库。这个库完全是C++,我们使用Boost来公开Python。因为我们不能保证我们的客户机安装了Boost库,所以我们静态地将Boost所需的功能拉入共享对象文件。编译的最后阶段对许多人来说都很熟悉

g++ -o <output> <objects> -Wl,-Bstatic -lboost_python -lboost_regex ... -Wl,-Bdynamic -shared <other_opts>

嗯,我想我只需要下载最新的boost(CentOS 7安装boost 1.53),然后自己构建。毕竟,这对我们一直都是有效的。我遵循规则,但我也犯了同样的错误。如何强制将-fPIC用于它构建的静态库?

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

这在boost 1.46.1上对我有效:

sudo ./bjam cxxflags=-fPIC cflags=-fPIC -a ... install
是您添加附加标志的地方,如
线程=多
--布局=标记
,以及可选的要生成的项目列表(例如:
--带有regex

注意:不需要同时使用
cflags
cxflags
,只需要一个。见下面的评论

参考链接:


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

sudo ./bjam cxxflags=-fPIC -a --with-system install
--使用系统是不必要的,但它是一个可以添加其他boost编译选项的地方


我在CentOS 7上使用boost 1.67时可以使用它。您确定gcc(或运行时的可执行文件)正在查找定制的boost库吗?您可以在运行时使用gcc中的
-L
LD\u library\u PATH
修改库搜索目录。您可以使用
cxflags=“-fPIC”
指导boost build使用编译器标志。有一个类似的变量名为
linkflags
。请参阅@NicholasM上的boost构建文档是的,我确信我的库正在被ld使用。我正在使用ld的-L选项来强制执行此操作。非常感谢您的链接。我使用的链接没有提到这一点,“因为我们不能保证我们的客户机安装了Boost库”,这就是我们发布依赖项的原因吗?在RPM的.spec文件中命名它们?@lightnessracesinorbit。这正是我最终决定要做的。Boost 1.61.0:
cflags
似乎是多余的。另外,对于本地(即非系统范围)安装,
sudo
应该是冗余的。@smbear我同意
cflags
可能是冗余的。我不确定是否需要它,但它似乎没有伤害。CXXFLAGS是C++和cFLAG C和C++。所以C++是严格意义上的冗余,但是Boost是C++,所以它们是一样的。你好,尼古拉,这个步骤在执行引导程序之后必须是一个步骤。是吗?@atari83就我记忆所及-是的
sudo ./bjam cxxflags=-fPIC -a --with-system install