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

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

Android应用程序开发者需要了解的五个内容 百度轻应用插件CloudaMySQL诞生记 盘点Github所用的开源项目 开源不只是面对开发者 见证新一代全能大数据计算平台崛起 ——中国Spark技术峰会将于4月19日在北京召开 大佬放猛料的节奏 阿里云聚无线为开发者提供一站式服务 智能硬件又添新选手 汉王推出便携PM2.5检测仪 2014年首场百度轻应用高级训练营落幕 现场展示云端结合能力 销售易史彦泽:企业应用,自上而下的革命 专访寻医问药网创始人:轻应用背后的长尾效应 轻松打造品牌轻应用:实时Web App开发框架Clouda Intel强势入驻,Cloudera新一轮融资总额已达9亿美元 每个Web开发者必备的9个软技能 4月1日:闻名世界的苹果公司正式成立 AMD正在探索一种新颖的Linux开源驱动模式 QQ手机浏览器推出5.1播霸版 内置强解码引擎支持22种视频格式 Ceph浅析(上):概况与设计思想 IBM:你好,互联网 光网络SDN化的四大驱动力及两条路径 《近匠》酷传:解除App发布和监控痛苦 有道heX正式开源:用HTML5和NodeJS开发桌面应用 在3D空间创作:英大学生发明增强现实设计产品 2014年3月浏览器份额:Chrome终超Firefox 成市场第二大浏览器 2014年3月操作系统份额:Windows 7大涨,Windows XP仍未跌破27%大关 路透社:iPhone 6仅有4.7寸版本,将于5月量产,5.5寸遭冷冻 高端实战技术培训:OpenStack企业应用之路 据统计,Oracle已击败IBM跃居软件行业第二 【技术博客推荐】2014年值得关注的10个开源项目 Intel在深圳建立智能设备创新中心 将投入1亿美元 免费获得价值1200元Unity2014顶级盛会门票! IBM公布Softlayer中国业务落地时间表 交流交流多线程程序的开发经验好吗? 谁有关于ejb方面的书或者资料推荐??一定给分 Women over 50 谁编个例程给我,这50分就是谁的了。题目不难,相信高手5分钟就能做完。 jdk1.3+jswdk1.0.1 的JAVAbeans .class文件要放哪啊????? God painted it 提问:猪真的很幸福吗?要求 wywq(幸福如猪) 回答。 哪位高手做过可视电话的? VB能不能实现“一个结构体类型的数组当参数传递 Forgotten Birthd Husbands Overheard Fine 有个在多线程中使用ADO的问题。请高手们帮忙。 Suede jacket 可能是installshield的Bug! 我想去北京找个工作,请大家帮帮忙,提供点信息! 装了“猫”为何还有630错误(电话线也接了)? excel 問題 各位:数据窗口有一检索变量,现在想retrieve出所有的记录,检索变量应该怎样赋值?谢谢! linux和windows是不是只能分别装在两个分区中 关于图像处理:如何使图像锐化与柔化? 帮帮我啦! 我在使用jdbc读取数据的时候,碰到了内存溢出的问题,怎么回事呀 哪里有餐饮系统的介绍?90不够的话,先欠着,多谢了! 在两个ASP程序之间怎么传递参数? ccl2000(不帅不酷的Goblin):其实你真的很酷很帅的。 大侠帮帮我啦(关于SQL语句的问题) 关于Vxd的编译问题 用VC编的程序,一运行就说“执行非法操作”,问题出在哪里?? SQL Server有病 一个关于api的简单问题 《易佳自定义报表》用后很失望 请教各位高手一个有关报表控件的问题? 小妹向大家请教!可不可以直接在本页的代码中改变该页面浏览时的属性? 家菲猫:惊悉你昨晚惨遭不幸,被窃大量钱物,今日一天无法和你联系上,估计手机和通信录已全部丢失,如果今晚无法来我处,明早8点以前请务必携猫 MM 赶到上海南站!!! MDI文档模板和应用程序调用问题请教,大侠请进! 一个c++问题???? 请问各位高手,sqlserver2k加密的存储过程是否能解密,看到它的实际的语句?可否能跟踪加密的存储过程? 我下载了一个formula one ,发现她的界面跟excel差不多,在pb中怎么用? 高分求XML 高级编程(足本)[01.pdf到10.pdf]!!!! 招聘汇编程序员 ie 中true dbgrid 的问题 急招聘汇编程序员 关于WINDONWS文件夹 WIN2000有关用户管理的问题 谁可以告诉我怎么调用已有的EXE文件。 有谁知道广州或南海的高级程序员考试的辅导点 如何把系统时间作为一个文件的保存名? TURBO C语言对磁盘操作的问题 着急招聘汇编程序员 为什么大家得的都是0分? 溴水加入到直馏汽油这个会发生反应吗.发生反应是使溴水褪色么..还是说他们是萃取的关系... 常减压蒸馏产品质量调节 高二化学知识点总结 裂解和裂化哪个是深度裂化 加氢裂化工艺提供商 A、B、C、D、E均为可溶于水的固体,组成它们的离子有:阳离子:Na+、Mg2+、Al3+、Ba2+阴离子:OH-、Cl-、碳酸根离子、硫酸根离子、硫酸氢根离子分别取其水溶液进行试验,结果如下:①A溶液与B 环烷烃是不是饱和烃?如果是,为什么他有一个不饱和度? 加氢裂化过程主要发生哪几种化学反应? 热方程式的加减怎么个加减法?是否可以据一些例子? 链状烷烃叫烷烃?环状烷烃叫环烷烃? 松花蛋的制作过程中所发生的化学反应 已知在298K时下列反映的有关数据:C(s)+1/2O2(g)==CO(g),ΔH1=-110.5Kj/mol C(s)+O2(g)==CO2(g) ,ΔH2=-393.5KJ/mol 则C(s)+CO2(g)==2CO(g)的ΔH为( )A、283.5Kj/mol B、172.5Kj/mol C、-172,5Kj/mol D、-504Kj/mol(╯3╰) 既然饱和烃就是烷烃,而环烷烃不是烷烃,为什么环烷烃是饱和烃? 溶解过程有发生化学反应吗? 高二化学热反应反应物质的量基本计算已知C(s)+O2(g)=CO2(g); △H1 C(s)+1\2O2(g)=CO(g);△H2.求△H1与△H2的相对大小? 含有5个碳原子的烷烃,经催化裂化后生成的烷烃最多有几种 化学反应中,反应物的量和滴加顺序不同对生成物不同的化学反应有哪几种? 试验中不能测出由石墨和氧气反应生成甲烷的反应热ΔH4,但可测出CH4,C,H2 燃烧反应中的反应热ΔH1=-890.3,ΔH2=-393.5,ΔH3=-285.8 根据盖斯定理求ΔH4 用丙烯为原料制配聚丙烯腈的化学方程式,可以选用必要的无机试剂 环烷烃是饱和烃吗 有能量变化的过程一定发生化学反应吗 丙烯制备丙三醇的化学反应方程式 催化裂化反应为什么原料性质变重,反应温度上升 怎样区分别润滑油是不是用加氢裂化基础油调和? 丙烯、淀粉、醋酸钠、乙酸乙酯谁和水反应只生成一种物质 催化裂化分馏塔顶压控多少有什么决定 32#基础油中32#是什么意思 苯丙烯和水反应生成什么 水溶液中R值是什么意思? 市场上由1类基础油,2类基础油,3类基础油制的的润滑油价格分别是多少?要看具体什么产品?同种产品部同厂家出来的质量和价格都不一样,给个大概的价位给你参考一类:7000-8000二类:8000-10000 丙烯与水发生加成反应需要什么条件? Excel添加趋势线中的R平方值和截距分别是什么意思? 三类基础油与二类基础油的区分Ultra-S2(60N),Ultra-S3(70N),Ultra-S4(100N),Ultra-S6(150N),Ultra-S8(250N),以上这些有的公司把它们都划分到三类基础油当中,虽然Ultra-S2\S3的粘度指数上写的是二 丙烯与水反应 用R语言估计参数值 请帮忙解释下面这段R语言程序每句的含义,> N x1 x2 n pai for(i in 1:N){+ x1 氢气在加氢裂化过程中起什么作用? 丙烯和氧气反应方程式,它们会反应么、生成水和二氧化碳 已知定义在R上的奇函数f(x)满足f(x+2)=-f(x),求f(6)的值 制取粗硅的过程中氢气起什么作用 下列物质的制取中,不能直接用乙烯作原料的是?聚乙烯 聚氯乙烯 二氯乙烷 溴乙烯 f(x)是定义在R上的奇函数,对任意∈R,总有f(x+3/2)=-f(x),则(-3/2)的值为多少 浮法玻璃氢气起什么作用 制取下列物质时,不能用乙烯做原料的是 A.聚乙烯 B.聚氯乙烯 C.氯乙烷 D.1,2-二溴乙烷 对于碳二加氢脱炔过程,为什么把催化剂用于前加氢 氢气的作用 制取下列物质时,不能用乙烯作原料的是 A.CH3CH2CL B.聚氯乙烯 C.聚乙烯 D.CH2Br-CH2Br答案是选B 为什么? 对于碳二加氢脱过程,为什么把催化剂不能用于前加氢 反应了什么事件 请问由于工作需要经常接触液化气,重芳烃,汽油,轻芳烃等化工原料,对身体有什么伤害?请问由于工作需要经常接触液化气,C4,石脑油,重芳烃,汽油,富气,干气,轻芳烃等化工原料,对身 什么叫加氢裂化? 在重大政治事件中的表现和认识 怎么写···急 急··· 我骑摩托车 不加汽油 ,直接用轻芳烃代替 行么 “加氢裂化装置”如何翻译成英语 材料反映了什么事件从有最早的历史记录以来,没有一桩伟大的事业能像十八世纪后半期一个主要鞑靼民族跨越亚洲草原向东迁逃那样轰动于世,那样令人激动的了. 直流汽油中的芳香烃是什么样的?能使酸性高锰酸钾褪色吗,能使溴水褪色吗? 什么是催化裂化汽油求答案 关注时事对大学生成才有何意义200字左右 请教一个汽油芳香烃的问题我想问一下,比如93#汽油和0#柴油相比,哪个芳香烃含量更低些,大概能低多少呢? 常减压蒸馏汽油、柴油与焦化汽油与柴油的区别 《七律长征》中反映了什么事件?“三军”是指什么?在这一过程中召开过什么重要会议?有何意义?务必一一回答,最好简短一点,
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn