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

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

优化Dalvik虚拟机的堆内存分配 Android标题栏进度指示器使用方法 Thread和Looper以及Handler和Message详解 Android开发必读 layout资源包含,android开发必读 Android本地化开发技巧 Android开发网将推出每天一类专题 ExifInterface使用,Android 2.0新增类 GraphableButton类实现Android UI开发 Android控件开发之ToggleButton原理 Android标题栏TitleBar全攻略 AsyncTask实例代码演示Android异步任务 重绘TextView类演示Android的Handler Android的SoundPool类使用与利弊 AsyncTask解决Android UI堵塞问题 Android自定义View实例AnalogClock源码 Android UI开发专题(五) Bitmap和Canvas实例 Android UI开发专题(四) View自绘控件 Android UI开发专题(三) 各种Drawable 提高Android开发效率-Eclipse快捷键大全 Android UI开发专题(二) 之绘图基础 Android UI开发专题(一) 之界面设计 Only the original thread that created a view hierarchy can touch its views的相关 Android上的Back键事件捕获 Android蓝牙API之BluetoothSocket类(2) Android蓝牙API之BluetoothSocket类 Android蓝牙API之BluetoothAdapter类(1) Android蓝牙API之BluetoothAdapter类(2) AndroidManifest.xml文件剖析 (三) AndroidManifest.xml文件剖析 (二) AndroidManifest.xml文件剖析 (一) MOTODEV初体验,高效Android开发工具 Longhorn与WINDOWS2003是何关系? 关于NullPointerException异常,谢谢! 一个查询问题 高手关注:为什么收不到 WM_NCLBUTTONUP 消息? 毕业设计的问题(急) 关于SQLSERVER的BACKUPLOG 关于qq菜单的问题 GD绘图输出问题? 怎样在数据窗口中设置打印,要求实现自定义纸张??? 关于初学做练习的问题请教! 实现界面重定义的问题 有关对话框显示前的... 关于photoshop中的问题! 在CXXXApp里如何调用CXXXDoc里的变量? 关于ADO对象的用法? .x文件中animation set中的rotation是弧度,还是? [php版]公告:关于删除 IShellFolder 发贴的通知! 有了seq server基础,想深入学习一下,改怎么做? 请问高手,有关数据导入导出的问题! 高分求《VC技术内幕》第5版 求源码!!!!!! 出大问题了 notes designer的问题(在线等候.....)急!! 关于csdn上的网络道德问题!大家的网络需要大家共同来支持!(每一个真正的程序员都应来声援!) 高分回报:一条简单的SQL语句写法,谢谢各位大侠, asp中寫Response.cookies ("ITEM1")("SUBA")="Standy"在dotnet(C#)中如何讀出 在局域网内。知道一个机器的IP地址。如果获取这台机器的名字 带外数据具体有何用途?(在线等) 加了一个三角,高兴,散分! 请问一个三位重构的问题,哪里有这羊的的示例程序? 显卡显示有阴影??? 有挑战性的翻译,请翻译下列C++名词,并请举例说明 麻烦大哥们看看!关于wab应用中在datagrid中取值的问题 如何实现CSDN这样回答问题的效果? 初级问题,请各位大侠帮忙! 数据结构中关于二叉排序树的生成问题 请教高手:如何在一区域找到找到指定颜色的点?? 一个关于窗口的问题 如何在数据窗口实现编辑、修改等后的撤消、复制、粘贴、剪切功能! exec,sp_executesql语句,中字符串变量的问题 急~~~~(请赐教)! window.showModaldialog()问题 关于Internet Explorer不能打开链接的问题 求助 求购:中国地质大学(京)网络历年考研题复习资料 Longhorn与WINDOWS2003是何关系? applet的执行顺序问题?? 在数组里找到最大值的函数是什么? 没有监听器? VB .NET能用于AutoCAD开发吗? 如何用OnMouseWheel实现Image的放大缩小? 装了Media Player 9.0,怎么没声音? 如何将DataSet中的数据全部写入数据库? 简单问题(关于光标移动) 天空中飘落的雪花干净吗? 关于函数表达方法的一道难题已知函数y=f(x)满足f(x)=2f(1/x)+x,求f(x)的解析式 这个问题?化学的为什么选C呀?可我觉得都不对呀! 对于减轻中小学学业负担的问题,引起了社会的极大关注.改病句 天空是什么颜色的天空也是蓝色的因为它们曾经相爱过 谁知道具有吸附性的物质除了用PH 纸,还能用什么试剂鉴定?能具体列出来吗?sorry .没有完整,就是有吸附性的物质除了用PH试纸之外,还能用什么试剂来鉴别他的酸碱性? 全面推行素质教育,是当前教育的当务之急 改病句 三年级的英语作文【题目:Me】50字以上可不可以唔后这么长,最好有翻译~~~~简单介绍,快滴丫 如图,下图 tea'mo 怎么读 天空是蓝色的海也是蓝色的心是什么颜色的? 谁有7年级下册 同步练习1+1 (华东师大版)练习册的参考答案?帮帮忙啊``!及需啊 .. 救命啊 .. 快啊.我 急要. 求求大家帮帮忙.~! TEA‘MO是什么电影中的台词 18函数高中 所有练习题答案(同步训练和配套练习册),有一门发一门,从后往前发,前边的都写完了,最后2~3单元就行,但语文配套练习册全要! 泰语TEA'MO怎么读用汉字标出读音, 第二个式子中为何-1, 延边人民出版社的,要是方便给下册也给我也行啊!..1.许多人类学家认为i,人的始祖是( ) A.两河流域的苏美尔人 B.中国南方古猿 C.非洲南方古猿 D.腊玛古猿 这是第1课 人类的形成的第一题 Tea 怎么用函数表示这几个式子xy=10根号下x²+y²=dl=2X+2y 一个操场如下图,沿着操场跑道跑一圈是多少米? 天空是蓝色.白云是白色.彩虹五颜六色.那么我们的世界是什么颜色?天空.白云.彩虹都 有自己的独特色彩.我们的世界也一样吗? 急需5篇初中水平英语作文!50字即可.有关旅游·初中生活·购物·新年==都可以.在此说明〔支持原创!打击盗版! 体育场跑道如下,运动员跑了5圈,他跑了多少米?中间是一个长方形长为100米,一边一个半圆圆的半径为25米 求能证明“读书足以怡情,足以傅彩,足以长才.”的论据分别是足以怡情 足以傅彩 足以长才的论据 要3个 我的正常的一天 早上 6:20 起床 6:40 坐车 7:15到校(20分以前就要到校 迟到的还要写检讨?游街示众?)7:20准时上第一节课(班里的平均分没上90要写检讨?)4;30 自习(说白了就是下午第四节课)5:5:10-6:30 中国近代史第一次巨变 跪求作文集的题目和封面要尽量大气一点,有深意更好.封面也是一样,最好有《明朝那些事儿》的封面的风格,谢了 立志做个美德少年 1、中国近代史上首次打破列强垄断局面的交通行业是? 谢谢~无.急。。 修改病句:对于大学生毕业生就业难的问题,引起了全社会的极大关注 为什么要把“对于”去掉?为什么要把“对于”去掉? 电工换算功率大全 曹刿论战的中心句和主旨句 雨来问爸爸说:“爸爸,远不远?”改成第三人称转述句 满天白雪像什么最好用文言文表达 电工的换算公式1安等于多少瓦 雪 雪 飘飘洒洒,纷纷扬扬,蹁跹(xiān)起舞,像鸟一样疾,像烟一样轻,像银一样白啊.雪飘飘洒洒,纷纷扬扬,蹁跹(xiān)起舞,像鸟一样疾,像烟一样轻,像银一样白啊.亲吻着久别的大地,拥抱着可爱的 国旗像什么在空中飘扬 曹刿论战中写曹刿详查敌情的句子 雪 飘飘洒洒,纷纷扬扬,蹁跹(xiān)起舞,像鸟一样疾,像烟一样轻,像银一样白啊.亲吻着久别的大地,拥雪飘飘洒洒,纷纷扬扬,蹁跹(xiān)起舞,像鸟一样疾,像烟一样轻,像银一样白啊.亲吻着久别的大 如今人们是怎样乐业的?“凡职业都是有乐趣的”找事实论据 电工换算调压变压器上1vA是怎么计算出来的要公式.我想知道1VA有多少电流. 雪 飘飘洒洒,纷纷扬扬,蹁跹(xiān)起舞,像鸟一样疾,像烟一样轻,像银一样白雪飘飘洒洒,纷纷扬扬,蹁跹(xiān)起舞,像鸟一样疾,像烟一样轻,像银一样白啊.亲吻着久别的大地,拥抱着可爱的故土.北 如何利用矩阵分析现实问题? 曹刿论战中写曹刿祥差敌情的句子是 高中函数有什么好方法吗难 天书 矩阵在物理中有应用吗? 请帮我用西班牙语翻译一下这句话:tie a mo! 父亲说 “这是我对你们的希望.” (将直接引用的改为转述) 矩阵在物理等学科上有什么应用 的读书笔记六年级水平的 我要做一本作文集,起什么名字比较好我前几个作文集叫《飞翔的兔子》《宛在水中央》《夜曲》 已知一次函数y=-ax+b与y=-cx+d的图象如图所示,则方程组ax+y=b,cx+y=d,的近似解可 新西兰的几维鸟是曾与恐龙生活在同一时代的古老鸟类,它: Master w/ slave present 若一次函数y=ax+b与y=cx+b在同一坐标系内的交点坐标是(2,-3),则方程组y=ax+b和y=cx+b的解是 新西兰几维鸟图案的奶粉是哪个啊? 雪像鹅毛一般,从天空中飘落下来.改成反问句 若一次函数y=ax+b和y=cx+b在同一坐标系内的图像的交点在第一象限,则方程组{y=ax+b{y=cx+b的解若一次函数y=ax+b和y=cx+b在同一坐标系内的图像的交点在第一象限,则方程组{y=ax+b y=cx+b的解x=m y=n 几维鸟和鸟类公园怎么样 韩外长:日本错误历史认知阻碍韩日关系日知名主播之子因盗窃被解雇 检方暂不奥巴马提名两名竞选支持者为美国驻外大韩在独岛海域清理垃圾17吨 吁居民游日土发表共同宣言 安倍决心加强战略伙意大利比萨斜塔修复见成效 12年扶正美称法国西班牙自行实施电子窃听行动 美称法国西班牙自行实施电子窃听行动 外媒:美联储资产规模恢复正常至少要到乌克兰法院裁定没收季莫申科女儿名下饭美国最新型隐身驱逐舰下水 因价格太贵欧洲多国遭风暴袭击 死亡人数已升至1食品安全法拟修改:消费者获赔最低千元日研究机构预测南海沟大震将致大阪13鲁炜要求网络媒体讲好百姓寻梦、追梦、前三季28省GDP已超全国3.7万亿卫计委回应放开“单独”二胎 表示尚无公务员养老制度新改革:养老“双轨制”学者称廉洁年金难反腐:传统文化缺少公中纪委面向全国征集廉政漫画 要鞭挞腐原标题:黑龙江一公安局欠债18年不还金山区人大常委会举行党的群众路线教育借助农村综合帮扶工作 金山品牌草莓实沈晓明赴浦东南码头路与上钢新村社区调孙继伟会见澳驻沪总领事一行 就贸易投金山区\"双特\"政策再拓宽 就业援纽约高中生在曼哈顿爆炸中受伤 向政府绿营全面杯葛服贸协议:苏贞昌谴责蓝军台外事部门吁日本还台慰安妇尊严 并做湖北召开新侨专业人士联谊会一届二次常车尾两处火头波及码头外墙 澳门一货车洛杉矶中华总商会会长庄佩源访汕头 冀山东泰安侨联被授予争创“五型”机关先连胜文自费聘随扈 以TOYOTA为座服役8年的军犬退役台北地铁1820间厕所一年堵500次“台独”大佬辜宽敏捐30亿财产回馈社研究称泳池中小便可生成致命化学物质3个儿子2死1昏迷 台湾老翁散尽家财陨落的舞蝶台湾高铁彰化站区发生大火 3000名男子以亏损为由躲回老家拒绝支付工人4
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘