Boost 源代码交叉编译

环境

操作系统:Ubuntu 16.04

 编译工具:gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu

boost源码

地址:https://sourceforge.net/projects/boost/files/boost/

编译

  1. 解压,cd 到目录
tar -zxvf boost_1_61_0.tar.gz 

--show-libraries可查看所有库

 --without-libraries=, , , 逗号隔开去掉不想编译的库,--prefix=/../ 指定编译后的安装路径

cd boost_1_61_0
./bootstrap.sh --prifix=./install

生成有 b2 和 bjam ,以及一个 project-config.jam 的文件,修改该文件的一行(指定自己的编译器):

using gcc : : /home/ke/softwares/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc ;

注意:这中间是有空格的,如下图标示的地方:

特别是最后一个分号前是有空格的,要不然会出错。

  2.执行 ./bjam 即可,这是编译,创建的 lib 文件默认在 stage 文件夹

  3. 编译完后,执行 ./bjam install 即进行安装,我的上面 --prefix=/.../ 指定的目录就是安装目录

./bjam –help

常用选项(Options)和属性(Properties)的说明,一般带有–前缀的关键词为option,没有的则为property。

属性

--show-libraries

显示需要编译才能使用的库列表

–-build-type=minimal|complete

--build-type=minimal为默认值,此时在Linux下只编译生成release版的动态链接C运行库(C++标准库)的多线程静态库和动态库
–build-type=complete,在Unix/linux下要编译多个变体(debug或release,多线程或单线程,静态库或动态库,静态链接或动态链接C运行库/C++标准库)。不建议全部编译,费时还费空间,提倡按需编译。

--layout=versioned|tagged|system

决定需要编译的库名及头文件的地址目录名的生成策略。默认Windows下--layout=versioned,Linux下–layout=system。
当同时编译多个版本时,最好设置–layout=versioned或–layout=tagged,否则编译多半会失败,原因是有的版本同时编译若不指定命名策略,可能在输出到指定目录的时候造成命名冲突。

注:–build-type=complete时,不需要设置此属性。但指定variant=debug,release等属性时,须确保–layout=versioned或–layout=tagged。

--build-dir=DIR

指定存放编译过程中生成的中间文件,目标文件等其他文件的目录,默认在./bin.v2。

--with-libraries

创建和安装指定的库

--without-libraries

不对指定的库进行创建和安装,默认创建所有的库

安装:关键词 install 或 stage

./bjam install

install会安装头文件和库文件到相应指定目录,头文件安装到/usr/local/include下,库文件安装到/usr/local/lib下。具体指定安装目录见./bjam –help。

./bjam stage

stage生成的库文件到一个目录下,通常默认就在./stage下。

注:install 和 stage 貌似不能同时使用,中间会卡住。若编译过程中未指定install或stage,则生成的目标库文件只存在于–build-dir所指的目录中,默认为./bin.v2。考虑到此,若无需将头文件和库文件安装,则推荐使用stage关键字。

属性

toolset=toolset

指定编译器,默认自动检测,安装了多个编译器的时候可以使用此属性。

variant=debug|release

指定编译debug或release版本。

link=static|shared

指定创建静态库或动态库

runtime-link=static|shared

指定创建的库是静态链接还是动态链接到C运行库(或C++标准库),这个选项需依据–link的类型,不同的编译器允许的链接策略不一样,比如在GCC下,在生成动态库(–link=shared)时,就不允许进行静态链接到C运行库(或C++标准库)。

threading=single|multi

指定创建多线程或单线程的版本库。

属性可同时设置,如下两种方式,为了避免名字冲突,建议采取propery=value的格式:

./bjam variant=debug,release stage

./bjam variant=debug variant=release

这两种方式都可以

最后执行的创建命令:

sudo ./bjam --without-python --layout=tagged variant=debug,release link=static,shared runtime-link=shared threading=multi stage

博客参考: http://blog.csdn.net/lc250123/article/details/52468121 && http://blog.sina.com.cn/s/blog_615770bd01018r2h.html

项目工程需要libboost_iostreams-mt.so 库,但是由于缺少bzip2和zlib库而编译失败。

解决方案:

1. 首先再在zlib 和 bzip2的源代码,之后进行交叉编译,较查编译选项需要将 -fPIC 添加上,否则生成iostreams库时候会有问题。

set(CMAKE_CXX_FLAGS“$ {CMAKE_CXX_FLAGS} -fPIC”)

2. 编译iostreams库

sudo ./bjam --with-iostreams -s BZIP2_INCLUDE=/srv/tx2/bzip2-1.0.6/include -s BZIP2_LIBPATH=/srv/tx2/bzip2-1.0.6/lib -s ZLIB_INCLUDE=/srv/tx2/zlib-1.2.11/include -s ZLIB_LIBPATH=/srv/tx2/zlib-1.2.11/lib --layout=tagged variant=debug,release link=static,shared runtime-link=shared threading=multi stage

即可生成对应的libboost_iostreams-mt.so库

 iostreams 原文对对zlib和bzip2的依赖可以参考 https://www.boost.org/doc/libs/1_54_0/libs/iostreams/doc/installation.html

原文地址:https://www.cnblogs.com/flyinggod/p/12871298.html