Boost下载安装编译配置使用指南-程序员宅基地

技术标签: python  操作系统  c/c++  

转载:http://www.cppblog.com/jerryma/archive/2011/10/17/158554.html

——更新于2011/7/19,目前我已对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里的代码,很容易可以读懂,并且值得我们学习。

转载于:https://www.cnblogs.com/redrainblog/p/4136191.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a539284554/article/details/102321399

智能推荐

Fastadmin工具栏按钮自定义添加_fastadmin 工具栏自定义按钮-程序员宅基地

文章浏览阅读8.1k次。1. index.html中添加自定义按钮注意 : Class中红框标示内容2. 对应JS中添加按钮对地址3.require-table.js中添加对应代码特别注意此处,红框标示内容必须修改一致..._fastadmin 工具栏自定义按钮

yolov5转换成rknn模型----预编译方法_rknn预编译-程序员宅基地

文章浏览阅读2.8k次。用如下脚本将yolov5模型转换成rknn模型if __name__ == '__main__': # Create RKNN object rknn = RKNN() if not os.path.exists(ONNX_MODEL): print('model not exist') exit(-1) # pre-process config print('--> Config model') rknn.c_rknn预编译

signature=664f9760ad1f1ac8fb5bff722b4da240,single-spa/yarn-error.log at master · fgcp020/single-spa ...-程序员宅基地

文章浏览阅读3.2k次。Arguments:C:\Program Files\nodejs\node.exe C:\Users\wupengli\AppData\Roaming\npm\node_modules\yarn\bin\yarn.js add bebel-loader -DPATH:C:\Program Files (x86)\NetSarang\Xshell 6\;C:\Windows\system32;C:..._local:file:///storage/emulated/0/ucdownloads/clouddrive/26fd557a87b0b

easyui datagrid-detailview 嵌套高度自适应_fixdetailrowheight-程序员宅基地

文章浏览阅读3.2w次,点赞5次,收藏4次。实现效果原因异步加载,明细展开时,可能会遇到父列表不能自动适应子列表高度的变化具体代码$('#centerdatagrid').datagrid({ url:'${ctx}/offer/offer!projectPage.htm', title: '项目列表', iconCls:'iconfont icon-iconlist', _fixdetailrowheight

3GPP TS 29244-g30 中英文对照 | 6.2.6 PFCP Association Setup Procedure-程序员宅基地

文章浏览阅读634次。学习5G知识,势必要去阅读相关的技术标准,而纯英文的标准协议对于初学者来说是个门槛。个人在学习5G标准3GPP TS 29244-g30过程中,也发现google的机器翻译实在晦涩难懂,所以个人在借助百度翻译(中国人更懂中文)的同时,人工对每句话进行了校对。在自己学习的同时,也将翻译内容分享给给广大网友。由于个人能力有限,翻译不到位的地方还请各位网友们指正。6.2.6 PFCP Association Setup ProcedurePFCP偶联建立程序6.2.6.1 GeneralT.._pfcp association

CanOpen的SDO、PDO简单通信使用_canopen pdo怎么区分读和写的-程序员宅基地

文章浏览阅读9.5k次,点赞17次,收藏103次。CanOpen部分笔记:CanOpen的一些简单的使用记录。为了简单明了,假设现在是用CAN盒子向使用CanOpen协议的设备通信我(假设设备地址ID为0x01)。SDO通信:如果想要读取设备某个参数。则使用此数据格式发送。比如读取设备索引为0x60c1,子索引0x01的参数。则发送如下参数:发送:0x601 40 c1 60 01 00 00 00 00接收:0x581 43 c1 60 01 01 02 03 04其中发送中的0x40表示读取数据,接收中的0x43表示接收到4个字节,_canopen pdo怎么区分读和写的

随便推点

上海交通大学计算机考研复试 2010年(java)_考研复试java的-程序员宅基地

文章浏览阅读239次。问题一:题目描述对于一个字符串,将其后缀子串进行排序,例如grain 其子串有: grain rain ain in n 然后对各子串按字典顺序排序,即: ain,grain,in,n,rain输入描述:每个案例为一行字符串。输出描述:将子串排序输出示例1输入grain输出aingraininnrainimport java.io.*;import ja..._考研复试java的

#实验 2-2 帧中继配置_帧中继手动映射-程序员宅基地

文章浏览阅读1.1k次。实验 2-2 帧中继配置学习目标 掌握用户边缘设备(CE)上帧中继接口的配置方法 掌握Hub-Spoke网络中RIP的配置方法 掌握Hub-Spoke(NBMA)网络中OSPF的配置方法 掌握点到多点网络中OSPF的配置方法场景企业的总部和部分分支之间仍使用帧中继网络互连,作为企业的网络管理员,您需要在总部和分支的边缘路由器上配置帧中继功能,并配置本地DLCI与IP地址间的..._帧中继手动映射

Linux下的文件系统以及磁盘操作-程序员宅基地

文章浏览阅读69次。在文件系统方面,Linux可以算得上操作系统中的 “瑞士军刀”。Linux 支持许多种文件系统,从日志型文件系统到集群文件系统和加密文件系统,而“什么是文件系统”?文件系统是对一个存储设备上的数据和元数据进行组织的机制。常见的文件系统:ext2、ext3、ext4、xfs、jfs、reiserfs、iso9660、swap、VFAT、VFS等例如..._保存当前磁盘分区表 #sfdisk-d

学会python可以做什么兼职,能做兼职吗_python可以做什么副业-程序员宅基地

文章浏览阅读1.2k次。学会python可以做什么兼职,普通人能做兼职吗_python可以做什么副业

Failed to execute goal on project sky-server: Could not resolve dependencies for project-程序员宅基地

文章浏览阅读534次,点赞19次,收藏7次。在父工程中先clean,后install。