windows下使用boost库并集成到codeblocks中

最近的工作需要使用,所以接触到了boost这个库,但是在编译使用的过程中遇到了一些麻烦,最后在网上搜索方法才解决。

感谢博文http://www.cnblogs.com/wondering/archive/2009/05/21/boost_setup.html


首先是下载boost,这个不用多说,感觉挺大的,下载完毕后解压缩,需要一些时间。。。我的版本是boost_1_55_0。


下载后的库需要手动编译,因为安装了codeblocks,所以一定有MinGW(可以在你的codeblocks安装目录下找到),将其中的bin目录加入到环境变量中,这样方便使用gcc编译。我的目录是E:\Program Files\CodeBlocks\MinGW\bin。加入后在cmd中输入gcc -v,如果显示gcc版本等信息,则完成。


使用cmd进入boost解压后的文件夹下,这里需要找到build.bat,因为需要运行这个脚本来生成bjam.exe,这是一个用来编译boost的程序。我的build.bat在F:\Download\boost_1_55_0\boost_1_55_0\tools\build\v2\engine目录下,因为版本的不同,可能目录也不尽相同,不行就搜索一下。找到后,使用cmd cd到这个目录下,运行build.bat gcc,之后会生成bin.ntx86文件夹,里面就有我们要的bjam.exe,将其复制到boost的最外层目录下,我的是F:\Download\boost_1_55_0\boost_1_55_0。


接下来是编译boost。

接下来就是最重要的编译步骤了。需要打开命令提示符(cmd.exe)窗口并执行bjam,可以使用--help参数来查看命令帮助。这里详细讲解一下bjam的命令行参数,因为它非常重要。首先,它涉及到编程环境的搭建,你需要根据自己今后具体的使用环境来选择合适的命令行参数;其次,它影响到你的硬盘空间,完全编译的话据说在3G以上,如果你同时拥有2个以上的IDE(如VC6和VC9共存)而且都要用到boost,那么占用多少硬盘就自己算吧……虽说如今大家的硬盘空间都不成问题,但就像本人一样崇尚合理利用资源不习惯铺张浪费提倡节俭的童鞋应该大有人在,所以不需要的配置和不需要的库就可以不编译了。综合以上两点因素,本人使用的bjam命令如下:

bjam stage --toolset=gcc --without-graph --without-graph_parallel --without-math --without-mpi --without-python --without-serialization --without-wave --stagedir="E:\boost" 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 install --toolset=gcc --prefix="您的\boost\安装\目标路径" --build-type=complete
 
直接指定编译器以完全模式编译即可,这样可以满足今后的一切使用场合,但同时带来的后果是:
1、占用3G以上的硬盘空间
2、占用若干小时的编译时间

3、生成的很多文件可以永远也用不上


接下来是codeblocks的配置,将boost库加入到编译环境中。

点击settings->Compiler settings,在标签中点击search directories,在Compiler中点击Add,将下载下来的boost源文件夹F:\Download\boost_1_55_0\boost_1_55_0中的boost文件夹目录加入,里面包含着各种头文件,或者拷贝到刚刚编译的文件路径下,这样更加统一,即将E:\boost\boost_1_55_0加入,我这里的E:\boost\boost_1_55_0目录下拷贝了刚才的boost文件夹,注意,路径不要深入到boost文件夹下,否则使用的时候不方便。在Linker中加入刚刚编译出来的lib问价夹,E:\boost\lib。确定即可。

使用的时候包含所用头文件即可。

你可能感兴趣的:(c++)