环境
操作系统:Ubuntu 16.04
编译工具:gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu
boost源码
地址:https://sourceforge.net/projects/boost/files/boost/
编译
- 解压,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