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-16 19:45

基于3c2410的linux2.6.22移植(4)
二、NAND flash 分区管理 这块2410板自带了vivi,启动之后可以进到vivi的提示符下: vivi 查看分区情况: vivi part show mtdpart info. (6 partitions) name offset size flag vivi :0x00000000 0x00020000 0 128k param
[单片机]
基于ARM9和Linux的嵌入式打印终端系统
1 嵌入式打印终端系统 的设计原理 图1 打印终端原理图 嵌入式打印终端原理连接图如图1所示。主要由开发板、主机、打印机和扫描仪四部分组成。主机是一台PC机。开发板采用的是三星公司S3C2410开发板,ARM9的核,跑的是2.4内核版本的嵌入式Linux操作系统。扫描仪为超市等用的手持扫描仪。再加一台微型打印机接在开发板的GPIO口上。 工作流程为:开发板将扫描仪的数据从串口读出,然后通过网口将数据发送给主机进行检索处理。开发板等待直至接收到主机处理完毕的数据后转发给打印机,将信息打印出来。 2 嵌入式打印终端系统的硬件设计 2.1硬件开发平台S3C2410结构 三星公司的S
[单片机]
基于<font color='red'>ARM</font>9和<font color='red'>Linux</font>的嵌入式打印终端系统
ARM Linux内核驱动异常定位方法分析反汇编方式
最近在搞Atmel 的SAM9x25平台,Linux系统,用于工业设备。这也是我首次参与工业设备的研发。在调试Atmel SAM9x25的Linux串口设备的时候,发现无论是读还是写,都会产生异常。相关的异常信息如下: ================================================================================================================== Unable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = c0004000 *
[单片机]
苹果iOS去年出货 超越Windows
    苹果(Apple)iPhone卖得很好,大家都知道。有项统计数字进一步显示,在iPhone出货带动下,去年苹果整体iOS装置出货量,首次超越Windows装置的出货量。 国外媒体先前报导,市场分析网站Asymco.com分析师德迪乌(Horace Dediu)公布一项统计图表,显示去年苹果在笔记型电脑Mac、iPhone智慧型手机以及平板电脑iPad等iOS作业系统装置的出货量,超过3亿台。 报导引述Asymco统计,去年Windows作业系统终端装置出货量,大约2.75亿台。去年苹果iOS装置出货量,首次超越Winsows装置出货量。 苹果在截至去年12月底的2016会计年度第1季,iPhone单季销售量接近7
[手机便携]
研华产品多采用微软嵌入式系统开发
在IIC-China 2009深圳技术研讨会上,工控领域的老大研华科技的副总经理陈培齐一语惊人:“基于Windows Embedded OS的开发成本比Linux更低,而且开发周期更短。我们大部分产品采用Windows Embedded OS进行开发。” 从研华老总口里听到这话的确是有些意外,因为免费开源的Linux现在是业内的热点话题,很多小型厂商为了节省开发成本都在采用Linux开发产品,包括不少做工控设备的厂商。他们大都告诉笔者,Linux是免费的,因此开发成本会低很多,尽管他们承认必须花费不少的工程资源和时间去将它变成一个商业可用的产品。即便有些小供应商的技术研发实力不够强,他们也可从风河系统、MontaVi
[嵌入式]
嵌入式处理器ARM(Advanced RISC Machines)技术芯片
ARM (Advanced RISC Machines)公司从1991年推出第一种嵌入式RISC内核ARM6开始至今,经过十年多坚持不懈的打造,ARM已成为世界领先的嵌入式RISC处理器知识产权(IP)提供商。ARM公司是一个概念创新的公司,它首先提出知识产权公开出售授权的概念,它既不生产芯片,也不销售芯片,它的商业模式是搞设计和卖方案,它通过对数字电子公司在广泛的应用中使用高性能、低价格、低功耗的微处理器和系统芯片进行授权而获利。ARM公司也出售软件和开发系统,还提供咨询、技术支持、维护和培训服务,以加快大家对ARM体系结构和产品的认知和接受,从而改变了世界半导体行业的格局。它借助于拥有的强大技术优势,在世界范围内与许多业界领先的
[单片机]
tiny4412学习(三)之移植linux-4.x驱动(1)支持网卡驱动
一、思路 上一节我们通过DNW将内核、文件系统、设备树文件烧入到内存中,并使用bootm启动内核:bootm0x40600000 0x41000000 0x42000000。因为此时内核并没有SD卡驱动,和EMMC驱动,我们只能直接将系统拷贝至内存中然后启动。当时我们进入文件系统后,并无法挂载外面的网络文件系统,对开发带来很多不便,所以这一节,我们移植网卡,让系统启动后可以挂接虚拟机中的网络文件系统,或者直接挂载虚拟机中的网络文件系统。 实验参考摩斯电码的博客:http://www.cnblogs.com/pengdonglin137/p/5153794.html tiny4412网卡跟DM9000差别很大,DM9000是
[单片机]
tiny4412学习(三)之移植<font color='red'>linux</font>-4.x驱动(1)支持网卡驱动
Linux串口上网的简单实现
STRONG ARM Linux 进程调度(2.4.x) FireAngel(原作) BR /STRONG P 小弟最近研究了一段时间的ARM Linux,想把进程管理方面的感受跟大家交流下,不对的地方多多指点 /P P ---------------------------------------------- /P P Process Creation and Termination BR Process Scheduling and Dispatching BR Process Switching BR Porcess Synchronization and support for interprocess commu
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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