Boost下载安装编译配置使用指南(含Windows、Linux以及ARM Linux)

发布者:独享留白1028最新更新时间:2019-12-18 来源: eefocus关键字:Boost下载  编译配置  使用指南  Windows  Linux  及ARM  Linux) 手机看文章 扫描二维码
随时随地手机看文章

——更新于2011/7/19,目前我已对boost的安装和使用有了新的认识,因此也会对两年前写的这篇文章做大幅修改,网上转载版本泛滥,请以本文为准。

——更新于2013/3/20,增加ARM Linux下的编译配置方法。 

理论上,本文适用于boost的各个版本,尤其是最新版本1.48.0;适用于各种C++编译器,如VC6.0(部分库不支持),VS2003,VS2005,VS2008,VS2010,V2012,gcc,arm-linux-gcc,C++ Builder等。

先总结一下Windows系统。


一、下载

首先从boost官方主页http://www.boost.org/下载最新版boost安装包,或者使用Subversion获取最新版本,地址是:http://svn.boost.org/svn/boost/trunk。本人现在一般都用svn,这样可以很方便的进行update和build,而不是每次都下载新的安装包并rebuild。


二、安装

如果是使用下载的安装包,那么请将boost安装包解压至本地目录,如:E:SDKboost;如果是用svn的,也可以将boost的代码checkout到这个目录。因为boost一部分类是需要编译成库才能使用的,所以我们还需要准备好boost专用的编译辅助工具bjam。在命令提示符(cmd.exe)中执行根目录下的bootstrap.bat,编译后的bjam.exe会自动拷贝到该目录下(bjam必须与boost-build.jam在同级目录)。


三、编译

接下来就是最重要的编译步骤了。需要打开命令提示符(cmd.exe)窗口并执行bjam,可以使用--help参数来查看命令帮助。这里详细讲解一下bjam的命令行参数,因为它非常重要。首先,它涉及到编程环境的搭建,你需要根据自己今后具体的使用环境来选择合适的命令行参数;其次,它影响到你的硬盘空间,完全编译的话据说在3G以上,如果你同时拥有2个以上的IDE(如VC6和VC9共存)而且都要用到boost,那么占用多少硬盘就自己算吧……虽说如今大家的硬盘空间都不成问题,但就像本人一样崇尚合理利用资源不习惯铺张浪费提倡节俭的童鞋应该大有人在,所以不需要的配置和不需要的库就可以不编译了。综合以上两点因素,本人使用的bjam命令如下:

 

bjam stage --toolset=msvc-9.0 --without-graph --without-graph_parallel --without-math --without-mpi --without-python --without-serialization --without-wave --stagedir="E:SDKboostbinvc9" link=static runtime-link=shared runtime-link=static threading=multi debug release

 

下面详细解释一下每个参数的含义:

stage/install:stage表示只生成库(dll和lib),install还会生成包含头文件的include目录。本人推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录(E:SDKboostboost,只比include目录多几个非hpp文件,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。

 

toolset:指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等。

 

without/with:选择不编译/编译哪些库。因为python、mpi等库我都用不着,所以排除之。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都非常大,所以不需要的也可以without掉。这可以根据各人需要进行选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页http://www.python.org/下载安装。查看boost包含库的命令是bjam --show-libraries。

 

stagedir/prefix:stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不同的IDE指定不同的目录,如VS2008对应的是E:SDKboostbinvc9,VC6对应的是E:SDKboostbinvc6,否则都生成到一个目录下面,难以管理。如果使用了install参数,那么还将生成头文件目录,vc9对应的就是E:SDKboostbinvc9includeboost-1_46boost,vc6类似(光这路径都这样累赘,还是使用stage好)。

 

build-dir:编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录(E:SDKboost)下,目录名为bin.v2,等编译完成后可将这个目录全部删除(没用了),所以不需要去设置。

 

link:生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用static方式。一般boost库可能都是以static方式编译,因为最终发布程序带着boost的dll感觉会比较累赘。

 

runtime-link:动态/静态链接C/C++运行时库。同样有shared和static两种方式,这样runtime-link和link一共可以产生4种组合方式,各人可以根据自己的需要选择编译。一般link只选static的话,只需要编译2种组合即可,即link=static runtime-link=shared和link=static runtime-link=static,本人一般就编这两种组合。

 

threading:单/多线程编译。一般都写多线程程序,当然要指定multi方式了;如果需要编写单线程程序,那么还需要编译单线程库,可以使用single方式。

 

debug/release:编译debug/release版本。一般都是程序的debug版本对应库的debug版本,所以两个都编译。

 

本人按以上方式分别编译了静态链接和动态链接两个版本后,整个E:SDKboost目录有1.28G。如果不打算将来再升级boost版本,那么可以将编译生成的中间文件bin.v2目录删除,这样整个目录(包括安装包解压缩文件和编译生成的库文件)会减小至不到800MB,如果runtime-link只选了一种方式,那么整个目录只有600MB。事实上编译完成后除了boost和bin目录之外其他目录和文件已经可以删除了,这样还可以腾出350MB的空间来。不过我又研究了一下,其实libs这个目录也很有用,它提供了所有Boost类的使用范例,平时可以作为参考;另外doc目录是一个完整的boost使用帮助文档,当然最好也不要删了。其他几个目录和文件加起来也就几十兆,索性都给它们留一条生路吧。

 

呵呵,一个完整而又完美的boost目录就此诞生了。

需要注意的是,如果使用VS2008编译boost(其他版本VC未作测试,可能也有类似问题),那么假如你调用boost的主程序添加了_BIND_TO_CURRENT_VCLIBS_VERSION预定义宏来强制使用最新版本的Windows CRT库,那么你的boost也需要添加这个预定义宏来进行编译,否则会导致程序因为各模块使用的CRT库版本不统一而出现“在某些机器上运行提示‘由于应用程序配置不正确,应用程序未能启动’的问题”,关于该问题请参考我的另外一篇文章:【原】解决VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题。添加该预定义宏的方法是:打开boost安装根目录下的boostconfigcompilervisualc.hpp,在最上面增加:

// Added by terry, 2011/4/19, Force the linker to use the latest version of CRT/MFC/ATL dll
#ifndef _BIND_TO_CURRENT_VCLIBS_VERSION
#define _BIND_TO_CURRENT_VCLIBS_VERSION    1
#endif // _BIND_TO_CURRENT_VCLIBS_VERSION 

 

这种方法修改了boost的源码,并非我所愿, 但是无奈没有找到更好的方法,如果有人知道希望能够留言告诉我。

如果图省事,不想了解这么多,那么有简单的方法,可以使用命令:

 

bjam --toolset=msvc-9.0 --build-type=complete

 

直接指定编译器以完全模式编译即可,这样可以满足今后的一切使用场合,但同时带来的后果是:

1、占用3G以上的硬盘空间
2、占用若干小时的编译时间
3、头文件和库文件存放于C:Boost(本人非常反感)

4、生成的很多文件可以永远也用不上

四、配置

include目录:E:SDKboost

library目录:E:SDKboostbinvc9lib

添加到IDE相应的路径下面即可。

五、使用

使用举例:

 

#include 

 

此时,不用包含库文件,boost的auto-link机制将会自动帮我们包含对应的静态lib。也就是说,boost默认是以静态方式链接的,这样我们的工程属性最好也设为Multi-threaded (Debug)。如果想使用dll动态方式链接,需要预先定义宏:

 

#define BOOST_ALL_DYN_LINK

 

同样,此时boost也会默认帮我们包含对应的lib。如果不想使用boost提供的auto-link机制,或者对它的自动链接不太放心的话(其实大可不必担心),可以预先定义宏:

 

#define BOOST_ALL_NO_LIB

 

然后使用以下方法链接:

 

#pragma comment(lib, "boost_thread-vc90-mt-1_47.lib")

#pragma comment(lib, "boost_thread-vc90-mt.lib")

 

这两个lib其实是一样的,实在不明白boost编译时为什么每个库都要复制一份,难道是因为后者在升级boost版本后不用改代码?另外还有一个比较有用的宏:

 

#define BOOST_LIB_DIAGNOSTIC

 

它可以让VC在编译时的output窗口中输出程序具体链接了哪些boost库以及链接顺序。

 

关于boost的auto-link机制,详细可以看看boostconfigauto_link.hpp里的代码,很容易可以读懂,并且值得我们学习。

六、Linux下编译与配置的区别:

我的Linux与Windows使用了共享目录,将Windows下的E:SDK目录映射成了Linux下的/mnt/hgfs/sdk目录。

所以我的boost源文件根目录就是/mnt/hgfs/sdk/boost,cd进去。

首先需要编译bjam:

 

./bootstrap.sh

 

编译完成后,会在当前目录下生成bjam,接下来开始编译boost:

 

./bjam stage --toolset=gcc --with-date_time --with-thread --with-filesystem --with-program_options --stagedir="/mnt/hgfs/sdk/boost/bin/gcc" link=static runtime-link=static threading=multi debug release

 

这些参数的意义与Windows下完全一样,只不过编译器改成gcc,其他选项根据自己的需要进行设置。

生成的库文件就在bin/gcc/lib目录下,与vc9编译的一样。

如果将来不会再升级boost版本,那么可以把中间文件全部删掉,包括bin.v2目录和tools/jam/stage目录。

关于boost库的使用,为了不用每次写makefile都把boost的头文件和库文件的路径带着,而且为了让跨平台程序公用一套代码,

可以将boost的头文件和库文件路径加到Linux的环境变量中。打开/etc/profile,加入以下gcc环境变量: 

 

CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:"/mnt/hgfs/sdk/boost"
export CPLUS_INCLUDE_PATH

LIBRARY_PATH=$LIBRARY_PATH:"/mnt/hgfs/sdk/boost/bin/gcc/lib"
export LIBRARY_PATH

 

这样就可以直接使用boost的头文件和库文件了,并且与Windows共用一套代码,非常方便。

七、ARM Linux下编译与配置的区别:

编辑project-config.jam,修改using gcc这行。改为: 
using gcc : arm : arm-linux-gcc ;

注意空格不能删掉,必须保留;arm-linux-gcc可以换成你自己使用的编译器。使用bjam开始编译:

./bjam stage

注意这里,编译arm就不能像上面Windows和Linux那样带许多参数,否则编译出错;在网上看到别人可以使用--with或--without属性,我没尝试,应该是可以的,但其他参数可能就不支持了,有兴趣的话可以试验一下。

八、可参考的网上流行的几篇文章:

白话C++之安装boost:http://www.d2school.com/bhcpp_book/2_5.php

Windows VC6编译安装Boost库:http://blog.csdn.net/weekly123/archive/2007/11/23/1899188.aspx

boost编译步骤:http://blog.csdn.net/aheroofeast/archive/2009/03/22/4015458.aspx

boost 1.35.0 Visual Studio 2008编译指南:http://blog.csdn.net/benjiamen/archive/2008/07/12/2643705.aspx

VS2008下安装boost:http://www.cnblogs.com/xdotnet/archive/2008/03/22/boost_install_config.html

boost 1_43_0 在arm-linux下编译:http://blog.csdn.net/yujun_huoxu/article/details/7913135

标签: C++, Boost

关键字:Boost下载  编译配置  使用指南  Windows  Linux  及ARM  Linux) 引用地址:Boost下载安装编译配置使用指南(含Windows、Linux以及ARM Linux)

上一篇:飞凌OK6410开发板移植u-boot官方最新版u-boot-2012.10.tar.bz2
下一篇:痞子衡嵌入式:ARM Cortex-M文件那些事(2)- 链接文件(.icf)

推荐阅读最新更新时间:2024-11-07 09:25

Linux驱动入门
阅读此文的方法: 阅读以下2个文件: hello.c,asdf.c。 此文假设读者: 已经能用C语言编写Linux应用程序, 理解"字符设备文件, 块设备文件, 主设备号, 次设备号", 会写简单的Shell脚本和Makefile。 1. "hello.c" -------------------------------- /* * 这是我们的第一个源文件, * 它是一个可以加载的内核模块, * 加载时显示"Hello,World!", * 卸载时显示"Bye!"。 * 需要说明一点,写内核或内核模块不能用写应用程序时的系统调用或函数库, * 因为我们写的就是为应用程序提供系统调用的代码。 * 内核有专用的函数库,如 linux/
[嵌入式]
ARM Linux开发阶段性总结
简介:从我开始搞Linux,我就一直在网上或者图书馆中寻找“HOWTO”性质的文章,遗憾的是还真少。我也希望我的Blog成为我做的这块板子的“HOWTO”大全,呵呵。但是今天我不写“HOWTO”,对我的工作来个概括性的总结。 这一个月来,我一直投身于Linux内核移植的伟大而光荣的事业,相当的痛苦了…… 不过收获也是很大的,昨天晚上,哦应该是今天凌晨12:00,终于我的板子上出现了Busybox启动的好消息。Linux内核的移植终于取得了阶段性的成果,虽然后面的路还很长。 从我开始搞Linux,我就一直在网上或者图书馆中寻找“HOWTO”性质的文章,遗憾的是还真少。我也希望我的Blog成为我做的这块板子的“HOWTO”大全
[单片机]
linux系统学习1-8:第1个ARM裸板程序引申
第001节:辅线1_硬件知识_LED原理图 实现点亮LED的步骤: 1.看原理图,确定控制led的引脚 通过主芯片使用引脚输出:3.3V点亮led;0V熄灭led。 -接法: 引脚驱动能力不足:使用三极管, 接法介绍: -接法1: -接法2: 2.看主芯片手册,确定如何设置/控制引脚 3.写程序 第002节:辅线1_硬件知识_s3c2440启动流程与GPIO操作 知识点: 网络net,同名的net表示连接在一起 网络中的n,常表示低电平有效 怎么让GPF4输出1/0 先配置为输出引脚 设置状态 设置GPFCON =0b01(0b表示二进制,9为0,8为1),GPF4配置为输出 设置GPFDAT =
[单片机]
<font color='red'>linux</font>系统学习1-8:第1个<font color='red'>ARM</font>裸板程序<font color='red'>及</font>引申
英特尔推多款移动芯片 支持Windows/Android
    英特尔推多款移动芯片 支持Windows/Android 近日,根据一则消息成,全球最大半导体芯片制造商英特尔将在2014年推出多款针对平板电脑产品的移动处理器芯片,以提高覆盖产品的范围。并且Windows和Android系统也都将得到支持。 英特尔计划在2014年,根据产品定位不同,推出多款从入门到旗舰的处理器产品。目前,英特尔已经针对Windows 8/8.1推出了全新的BayTrail系列,2013年年底之前,能够支持Android的BayTrail也将会出现。 现在,我们已经测试过支持Windows 8/8.1操作系统BayTrail Z3740处理器,与之前在Windows系统平板上应用最多的Z2760相比,性能
[手机便携]
罗永浩揭秘锤子新系统:完胜iOS/Windows
锤子科技CEO罗永浩揭晓了坚果R1的部分细节。 罗永浩介绍,5月15日发布的“颠覆性”操作系统能秒杀Windows和iOS。根据曝光的消息,锤子新系统整合了人工智能技术,有望实现200%的效率提升。 配置方面,坚果R1搭载的是骁龙845处理器,这颗芯片基于10nm LPP工艺制程打造,采用Kryo 385架构、八核心设计,CPU主频达到了2.8GHz,GPU为Adreno 630,安兔兔跑分超过了27万。 拍照方面,罗永浩透露坚果R1的拍照是一流水准,而且提供相机水印功能,不过这个功能是默认关闭的。 最后是大家关心的价格,罗永浩透露价格在3000-15000元之间。该机将在5月15日鸟巢发布,我们拭目以待
[手机便携]
基于嵌入式Linux 的便携式RFID 信息采集与处理系统
射频识别( RFID) 是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据, 识别过程无需人工干预, 可工作于各种恶劣环境。RFID 技术在许多领域得到应用, 如停车场管理、集装箱运输管理系统等。在大多数应用中, 只要求有固定的阅读器,但在某些特殊系统中(如集装箱运输管理系统),不仅要求有固定的阅读器, 而且还要求有手持式读卡器。 TagMaster AB 公司是世界知名的RFID 读卡器制造商。它提供性能优良的固定式阅读器,也提供一种手持式阅读器。手持式读卡器由Caiso 公司的工业级PDA( Personal Digital Assistants ) 和TagMaster AB 公司的S1510组成。P
[网络通信]
微软看懵了 Windows 10系统使用率首次出现下滑
   Windows 10系统发布之后微软提出了为期1年的免费升级计划,期满后要想再升级Windows 10系统就需要付费了。在免费期结束后Windows 10系统的市场占有率有什么变化呢?据Net Applications最新统计数据显示,Windowa 7系统排名第一,Windows10系统排名第二。在过去一个月发生了一件令人意想不到的事情,Windows 10的市场占有率出人意料地下滑了,这预示着微软创造10亿台电脑使用Windows10操作系统的目标还需要更长的时间才能变为现实。   其实2016年9月的表现明显低于预期,而且此次下滑发生在微软停止提供免费更新服务的一个月后。作为一个宣传手段,微软经常强制用户对系统进行
[手机便携]
Linux 下使用s3c6410的post处理器的进行硬件缩放
在嵌入式下,在移植软件时经常会碰到这样的问题,就是显示分辩率的变化.一般软件往往针对桌面机的环境编译没有太多问题,但是在嵌入式环境下,受限的LCD显示有着很大的问题. 这种情况下,一种方法是修改代码,让其在嵌入式的LCD上显示.另外一种是使用软件进行显示缩放. 这两个方法只在部分条件有效,而且修改的工作量极大,更多情况是无法修改,比如SDL下的Dosbox是针对 640*480,修改源码的分辩率成 480*272 后,基本屏幕显示完全错位.软件无法正常运行. 这里有一种思路是使用s3c6410的post process.它是一个硬件进行图像和视频缩放的的模块.用POST后,只需要简单调整frame buffer显示库代码,即可
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved