说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Windows和Linux环境中Boost下载安装编译配置使用指南

HTML文档下载 WORD文档下载 PDF文档下载
本文是关于Boost编译最详细的文章,刚接触Boost的同学可以以此为参考。

 

作者:Terry Wang

 

[编者:本文是关于Boost编译最详细的文章,刚接触Boost的同学可以以此为参考。]

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

 

理论上,本文适用于boost的各个版本,尤其是最新版本1.47.0;适用于各种C++编译器,如VC6.0(部分库不支持),VS2003,VS2005,VS2008,VS2010,gcc,C++ Builder等。先总结一下Windows系统。

一、下载

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

二、安装

如果是使用下载的安装包,那么请将boost安装包解压至本地目录,如:E:\SDK\boost;如果是用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:\SDK\boost\bin\vc9" 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:\SDK\boost\boost,只比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:\SDK\boost\bin\vc9,VC6对应的是E:\SDK\boost\bin\vc6,否则都生成到一个目录下面,难以管理。如果使用了install参数,那么还将生成头文件目录,vc9对应的就是E:\SDK\boost\bin\vc9\include\boost-1_46\boost,vc6类似(光这路径都这样累赘,还是使用stage好)。

build-dir:编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录(E:\SDK\boost)下,目录名为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:\SDK\boost目录有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安装根目录下的boost\config\compiler\visualc.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:\SDK\boost

library目录:E:\SDK\boost\bin\vc9\lib

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

五、使用

使用举例:

#include <boost\thread.hpp>

此时,不用包含库文件,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机制,详细可以看看boost\config\auto_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共用一套代码,非常方便。

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

白话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

 

本文转载自:http://www.cnblogs.com/wondering/archive/2009/05/21/boost_setup.html

四火的唠叨:也谈谈全栈工程师 图形化与集成趋势 协同软件致远发新品V5.1 跨平台开发如何事半功倍 Xamarin推出免费培训 《近匠》上海庆科:海尔智能家居背后的云方案 轻松DIY智能硬件,开源电子原型平台Hippo-ADK 所见即所得!基于Polymer的设计工具Mobile UI Elements 好的产品经理是怎样炼成的? 统一架构、统一运维:UnitedStack发布UOS2.0 把轻应用带进汽车——宝马、百度编程马拉松大赛启动 “钢铁侠”Insteon的逆袭:声控智能家居新时代 游戏云纪元 第二届游戏运营技术论坛即将召开 Bitly:构建月处理60亿点击的分布式系统 重塑微软:Satya Nadella开启整合之路 推送工具个推完成B轮数千万美金融资 娱乐行业数据化 ABD爱梦娱乐发布大数据引擎产品 增强现实:10大AR应用窥探移动未来 LBS的硬件创新:高德LBS智能硬件编程马拉松圆满闭幕 2014优秀微信开发商评选上线 首批旅游汽车电商房产等行业应用出炉(表) 让梦想照进现实——宝马百度编程马拉松闭幕 IXDC大会:移动交互设计精髓——用户体验 想辨析“马航”等事件真伪,有很多技术和工具可以使用 两倍于IBM的基础设施投资,Google大力发展云服务 听云平台发布移动应用性能黑洞报告 微信开发者大会陶瑾:如何玩转微信支付功能的原理和开发 560亿PV+7.3亿用户,Reddit是如何做到的? 打造安全界的希波克拉底誓言文化 极客的春天来了! Mozilla COO宫力:老牌操作系统如何助力新一代智能电视 App提高用户留存率新招:应用性能监测 韩国手游市场规模超万亿 2014中韩手游项目对接会开幕在即 SanDisk发展之路:专注SSD、推新产品线 AMD发展线路图曝光,欲造500+平方毫米GPU 关于DCOM的应用系统分发的简单问题! IBM TP600硬盘加密问题!!!在线等待 关于Linux下配置邮件服务器 哪里有适合delphi6的控健(包括fastreport)可以下载? 设备无关位图的数据,为什么与显示在屏幕上的RGB不一样,高手不一定会! 什么防火墙比较好???? 能用到存储过程吗? 如何操作动态连接库! 征求兼职,简单的数据库项目,要求人在上海。 怪问题送分 第五把钥匙 两台属于不同域的都安装的活动目录的服务器,如何建立域间的信任关系 一个delphi combobox的问题! WebControl中包含的中文字显示不正常? 怎样读取注册表中的数据呢? 刚刚写好一个 NT/2000/XP 的 backdoor (反向连接,插入系统进程,通讯加密) 愚人节千万别上厕所(刚看到的,转) 散 分! 高手进行,绝对给分! 继续上一个问题提问,关于动态窗体 不能加载控件dbgrid32?????许可证末找到??? 美萍反黄专家技术大讨论! Linux与四系统并存启动 怎么追这个很正点的女孩啊。请教。。。 急啊,连接数据库(online 请教MPEG4编辑问题 我的操作系统是2000,请问如何调整虚拟内存的大小? 谢谢詹维,请进来 java汉字显示乱码问题?? 我想自己编写一个画线的函数,不用mfc中的,而且速度要比mfc快,所以我想直接操纵缓存,请问怎么做? SQL SERVER2000中数据转换问题? 一个很奇怪的问题!高手请进! postdata.att文件用什么软件打开! 组网 我的网站怎么了? 如何解决问题:"无法在 sysdepends 中添加当前存储过程所对应的行,因为缺少该存储过程所依赖的对象 '测试2'。仍将创建该存储过程。" 搜寻指定路径下的所有文件。急~~~ 请问有blob字段的表怎么插入阿??? mysql在windows和unix下的问题!!!!!! SQL脚本颁布问题 请问,在Access中如何使用宏语句控制report的页面为“横排”? 交换机 一个计算机编程高手一定要是数学家吗? 当出现了这些编译错误,怎么半?程序本身运行没问题 我的Ie被别人设了分级浏览 我毕业设计要做关于信息隐藏技术的东西。具体请进~~~50分~~~ 关于WEBLOGIC6.1SP2的问题...... 诸位大哥请教一个问题。 gump2000(阿甘) 关于SqlDataReader返回的行数 关于OFFICE的数据透视表(PivotTable) 锐角是第几象限的角?第一象限角一定是锐角吗?直角在第几象限?钝角在第几象限?我在此先谢过了! 请问关于四川(蜀)的古诗词有哪些名篇名句 Poverty depresses most people; in the case of my father,it was otherwise.其中的in the case of在这里怎么讲? 装有半瓶水的瓶子浮在水中为什么总是底朝上而口朝下呢? 描写成都风景的古诗是什么意思 in the case of 什么意思? who else's pen is this?的同义句 whose else=who else’s吗? 若向量a与b的夹角为120度,且a的绝对值=1,b的绝对值=2 c=a+b,则有A,c平行a B c垂直aC c平行b D c垂直b 描写梅花的诗句词 Whose pen is this的答句?Whose is this pen?的答句答:这是我的书 求和函数sum sumif sumifs subtotal 有什么区别 描写春天梅花景色的古诗 Whose pen is this 和Whose is this pen的区别在哪里 怎样证明三角形垂心性质 已知a的绝对值=2-根号2 whose pen is this与whose is this pen的区别 excel中的函数SUMIF和VLOOKUP的问题1、单元格H1中的表达式为=SUMIF(成绩!A2:成绩!A50,A22,成绩!F2:成绩!F50)求下拉的时候H2的表达式为=SUMIF(成绩!A2:成绩!A50,A23,成绩!F2:成绩!F50)H3的表达式为=SUMIF(成绩!A2: 设有定义int m=2,n=5,*p=&n;则语句“m=*p;”的结果是().A) 指针p指向mB) 变量m的值变为5C) 变量n的值变为2D) 指针p指向m,同时变量m的值变为5B和D有什么区别啊?D错哪了? Whose pen is this?It’s _____ (我的).Whose pen is that?It’s _____ (我的) pen 怎样证明三角形垂心交与一点? 如果有定义“int m,n=5,*p=&m;”,与m=n等价的语句是:A m= * p B * p= * &n C m=&n D m=* * p. -1080°角属于哪个象限?“任意角及度量” 这课滴这个角应该是坐标轴上的吧 那应该是哪个象限类? 有谁知道EXCEL中SUMIF 和VLOOKUP函数的区别?实用点的vLOOKUP函数是按列查找,SUMIF我就不懂了. 若已定义:int m=12,n=10,k;语句k=m&n;执行后k的值为()?A) 2 B) 6 C) 8 D) 14 求详解! a小于0,b大于0 a的绝对值小于b的绝对值 请化简 根号((a-b)的平方)—根号(a方)—根号(b方) 设a属于第二象限角,则 a/2属于第几象限180k+90°< a/2 对几个变量在定义时赋初值可以写成:int a=b=c=3; java这个程序为什么会等于0class B {private int num = 10;public void draw(){System.out.println("B.draw(),num"+num);}public B(){System.out.println("B constructor");draw();}}class A extends B{/*** @param args*/private int num = 1;public void dr 270°的角属于第几象限 象限角为钝角的终边在第二象限? java语句 Integer.parseInt(10)+1等于多少?String.valueOf(Integer.parseInt(10) + 1); 角-125度属于第几象限 第二象限角一定是钝角吗? 求1+2!+3!+...+20!的和.要java算法.+3!+...+20!等于多少. 子函数中得出的两个变量如何被主函数调用(C语言)假设子函数中通过公式得到两个变量值x,y,主函数中需要用到这两个值,该用什么方法调用? 第二象限的角一定是钝角对吗 英语翻译只要翻成中文就行 把装满水的量筒浸入水中,口朝下,用手抓住筒底竖直向上提,在筒口离开水面前,量筒露出水面的部分是 钝角都在第二象限和钝角指的是第二象限角哪个对? Everybody歌词+翻译后街的! 把装满水的量筒,口朝下禁摩在水中,抓住同底向上提,在筒口里开水面前量筒露出水面的部分()a.充满水 b.有水,但不满 c.没有水 d.依次出现上述现象 请问,钝角是第几象限角? 英语翻译Everybody needs somebody,somebody whom is called "Friend"."A friend in need is a friend indeed." If only that kind of friends can be called "Friends",then there are only few up-to-standards for me.About friendship,we have millions of quot 把装满水的量筒浸入水中,口朝下,用手抓住筒底竖直向上提,在筒口离开水面前,量筒露出水面的部分是在筒口在筒口离开水面前,量筒露出水面的部分是 “ 装满水的 ”为什么 excel subtotal里的1-9都分别是什么 怎么用? Everybody's friend is nobody's 把装满水的量筒口朝下浸入水中,然后抓住桶底往上提,在离开水面前,量桶露出的部分()A 是空的 B充满水 C 有水,但不满 D 没水 excel 公式 SUBTOTAL 应用这种写法是怎么做到的,能够选择各种查询的结果, 英语翻译Unable to continue becasure of a hardware or system error.sorrr but this error is unrecoverable.quit 浸在水中的装满水的量筒口朝下,抓住桶低朝上提,在桶口离开水面前,量筒露出水面的部分是?(空的?有水装不满?还是充满水的?形成此现象的原因是? EXCEL中使用SUBTOTAL 以后,每次筛选,把SUBTOTAL 也筛选了,这样就看不到筛选的结果,很不方便,大家帮忙想想为什么筛选以后把汇总的筛不见了,急尝试了选种筛选区域,还是没有用啊! 在直角坐标系中,分别作出下列各角,并指出它们是第几象限的角(1)120°(2) -240°(3) 45°(4) -315° 已知向量a=(-2,-1)b=(x,1).属于R 一:当x=3时,求a*b与a+b的绝对值 C语言定义变量的同时赋予数值和先定义后赋值有什么区别 直角是第几象限角? 已知向量a=(2,4,x),向量b=(2,y,2).a的绝对值为六且a垂直b.求x+y in case 和in case of 什么意思`什么区别`` 不属于任何一象限的角不一定是直角,还可能是什么角 若向量a=(x-3,yb=(x+3,y).且绝对值a+绝对值b=8求点M(x,y)的轨迹方程 in the case of 除了以防万一
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘