Boost在VS2008下的正确编译

Boost在VS2008下的正确编译 2010年11月28日   http://beyrens.blog.163.com/blog/static/9589445220 1052912424648/ 首先下载Boost_1_34_1.zip和Boost-jam-3.1.15.zip前一个是boost主文件包,后一个是编译Boost库用的JAME工具.   bjam stage --toolset=msvc-9.0 --without-python --without-mpi --without-wave --without-graph --without-math --without-serialization --stagedir="E:\SDK\boost_1_39_0\bin\vc9" link=static runtime-link=shared threading=multi debug release   stage/install:stage表示只生成库(dll和lib),install还会生成包含头文件的include目录。本人推荐使用stage,由于install生成的这个include目录实际就是boost安装包解压缩后的boost目录(E:\SDK\boost_1_39_0\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/下载安装。   stagedir/prefix:stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不一样的IDE指定不一样的目录,如VS2008对应的是E:\SDK\boost_1_39_0\bin\vc9,VC6对应的是E:\SDK\boost_1_39_0\bin\vc6,不然都生成到一个目录下面,难以管理。若是使用了install参数,那么还将生成头文件目录,vc9对应的就是E:\SDK\boost_1_39_0\bin\vc9\include\boost-1_39\boo st,vc6相似(光这路径都这样累赘,仍是使用stage好)。   build-dir:编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录(E:\SDK \boost_1_39_0)下,目录名为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_39_0目录(包括安装包解压缩文件和编译生成的库文件)只有不到500MB。事实上编译完成后安装包解压缩文件除了boost目录以外其余目录和文件已经能够删除了,这样还能够腾出150MB的空间来。不过我又研究了一下,其实libs这个目录也颇有用,它提供了全部Boost类的使用范例,平时能够做为参考;另外doc目录是一个完整的boost 使用帮助文档,固然最好也不要删了。这样剩下的几个目录和文件加起来也就十多兆,索性都给它们留一条生路吧。   呵呵,一个完整而又完美的boost目录就此诞生了。   若是图省事,不想了解这么多,那么有简单的方法,可使用命令:   bjam --toolset=msvc-9.0 --build-type=complete   直接指定编译器以彻底模式编译便可,这样能够知足从此的一切使用场合,但同时带来的后果是:   一、占用3G以上的硬盘空间   二、占用若干小时的编译时间   三、头文件和库文件存放于C:\Boost(我的很是反感)   四、生成的不少文件能够永远也用不上   首先下载Boost_1_34_1.zip和Boost-jam-3.1.15.zip前一个是boost主文件包,后一个是编译Boost库用的JAME工具.   现定义 %BOOST% 为Boost_1_34_1.zip的解压路径,%BOOST_BJAM%为Boost-jam-3.1.15.zip的解压路径.   打开%BOOST_BJAM%/Build.bat,修改其中的编译器路径.如:   if EXIST "%ProgramFiles%\Microsoft Visual Studio 8\VC\bin\VCVARS32.BAT" (   set "BOOST_JAM_TOOLSET=vc8"   set "BOOST_JAM_TOOLSET_ROOT=%ProgramFiles%\Microsoft Visual Studio 8\VC\bin\VCVARS32.BAT"   goto :eof)   setlocal & endlocal   修改成(VS2005):   if EXIST "D:\Program Files\Microsoft Visual Studio 8\VC\bin\VCVARS32.BAT" (   set "BOOST_JAM_TOOLSET=vc8"   set "BOOST_JAM_TOOLSET_ROOT=D:\Program Files\\Microsoft Visual Studio 8\VC\bin\VCVARS32.BAT"   goto :eof)   setlocal & endlocal   或者(VS98):   if EXIST "C:\Program Files\\Microsoft Visual Studio\VC\bin\VCVARS32.BAT" (   set "BOOST_JAM_TOOLSET=vc8"   set "BOOST_JAM_TOOLSET_ROOT=C:\Program Files\\Microsoft Visual Studio\VC\bin\VCVARS32.BAT"   goto :eof)   setlocal & endlocal   保存后执行build.bat.完成后会在%BOOST_BJAM%\bin.ntx86目录下面生成一个bjam.exe的文件,一会用它来编译生成boost的库文件.   把bjam.exe拷贝到%BOOST%目录下,并新建一个Build.bat文件.编辑Build.bat   call "D:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"   bjam -sBOOST_ROOT=. -sTOOLS=vc-8_0 --build-dir=. --with-regex --toolset=msvc stage   这样能够在%BOOST%\stage\lib目录下生成所需的库文件.个人感受是添加"--with"参数,一个库一个库的编译(也许能够同时添加多个库我没有试)会快点.通常用不到Python、test、thread(Boost的thread库对Windows平台的支持并很差,由于他是基于Posix线程的),而最占时间的应该是Python库了.   须要编译的Boost库一共有12个,都是与平台相关的库.分别为:   Date_time   Test   Python   Filesystem   Thread   Wave   Program_options   Regex   Serialization   Signals   Graph   Iostreams   编译好以后,就能够在VS2005的"工具"-->"选项",选择"项目和解决方案"-->"vc++ 目录"中将%BOOST%\lib和%BOOST%\stage\lib添加"库文件"中,将"%BOOST%"添加到"包含文件"中.   在VC98中,选择"Tools” ->"Options” ->"Diretories” ->"Show Diretories for”,一样将以上文件夹分别添加到"Include Files"和 "Library Files"中.   最后测试一下是否安装成功:   #include "stdafx.h"   #include   #include   #include   #include   #include   using namespace std;   using namespace boost;   regex expression("^select ([a-zA-Z]*) from ([a-zA-Z]*);");   int main(int argc, char* argv[])   {   std::string in;   cmatch what;   cout "enter test string" endl;   getline(cin,in);   if(regex_match(in.c_str(), what, expression))   {   for(int i=0;i cout }   else   {   cout }   return 0;   }输入:select name from database;   输出:str:select name from table;   str:name   str:table   这样就完成了. 首先,从Boost库的官方网站 进行Boost的下载,最新的版本多是1.39.0,不过我使用的1.36版本。下载完成并解压,就能够了。解压后的空间可能会很大。因此请预先留足空间。编译以后会用更多的空间。 编译的过程很漫长,并且会占用至关大的磁盘空间。   (1)运行tools/jam/src/build.bat。   (2)将bin.ntx86文件夹下的bjam文件夹拷贝至Boost安装根目录。   (3)完整编译命令以下   bjam toolset=msvc threading=multi variant=debug release stage   其中toolset指的是编译器,msvc就表示微软的VS编译器;threading是表示单线程或者多线程,通常都为多线程;variant是一些参数,debug release表示既编译出debug版本,又编译出release版本,stage表示编译出来的文件都放在stage目录下。   以上是彻底编译,若是不想彻底编译的话,能够用--without指定不想编译的库,例如--without -wave等等。   3. Boost库的使用   (1)打开VS,单击VC配置,工具,选项,VC++目录。   在包含文件那一项,添加Boost的根目录;在库文件那一项,添加刚刚编译出来的库所在的目录(stage)。   这样就完成。   (2)写个测试程序。当上述程序编译经过,并能够正常运行,表示Boost库的安装已经成功。   view plain copy to clipboard print ?   1. #include   2. #include   3. #include   4. [b]int[/b] main()   5. {   6. boost::asio::io_service io;   7. boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));   8. t.wait();   9. std::cout "Hello, world!\n";   10. return 0;   11. }   #include #include #include int main() { boost::asio::io_service io; boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); t.wait(); std::cout "Hello, world!\n"; return 0; }   1)下载boost   http://www.boost.org/users/download/   这是它的下载页面,须要下载2个东西:   Packaged Releases   VERSION 1.35.0   和   Boost Jam 3.1.16   你须要在每一个条目下面找到Details | Download字样,点击Download,进入下载页。但是遗憾的是sourceforge站点被封了,因此一般你是没法下载的。(我诅咒封这个站点的人)。所以有必要使用某些特殊的工具来穿透这个封锁。我下载的是这个:   boost_1_35_0.tar.gz   和   boost-jam-3.1.16.zip   2)下载Python2.5.2   http://www.python.org/download/   在这个页面点击Python2.5.2 Windows Installer   获得一个Python2.5.2.msi后,便可点击安装。我安装在C:OpenSourcePython25   建立一个批处理文件:pt.bat,内容以下: set path=C:OpenSourcePython25   Python 而后启用命令行工具(运行cmd.exe),进入pt.bat所在目录,键入pt.bat   若是你看到>>>的提示符号,说明python安装成功。   3)编译boost-jam   解压boost_1_35_0.tar.gz,到目录boost_1_35_0。个人是在C:OpenSource boost_1_35_0。这样你在C:OpenSource boost_1_35_0下就能发现boost-build.jam这个文件。   解压boost-jam-3.1.16.zip,而后在目录下双击build.bat,即进行编译。编译结束,能够发现生成了bin.ntx86bjam.exe。   咱们要的就是这个bjam.exe,把它复制到boost_1_35_0目录下,在这个目录下有boost-build.jam文件。   4)彻底编译boost_1_35_0   编译所有库。虽然你能够只编译一部分,可是仍是所有编译,省的之后麻烦。为此你须要编写一个批处理文件,我命名它为boost.bat: SET MSVC_ROOT="F:Microsoft Visual Studio 8VC"   SET VISUALC="F:Microsoft Visual Studio 8VC"   SET JAM_TOOLSET=VISUALC   SET PYTHON_ROOT=C:OpenSourcePython25   SET PYTHON_VERSION=2.5.2   SET PATH=C:OpenSourceboost_1_35_0 你要保证你的路径是正确设置的。而后把这个文件保存到C:OpenSource下面。(其实位置不重要)。而后启用命令行工具(cmd)。相似地输入下面的命令(表示回车): C:OpenSource>boost.bat   C:OpenSource>cd boost_1_35_0   C:OpenSourceboost_1_35_0>bjam -sBOOST_ROOT=. -sTOOLS=msvc 而后你就等待吧。一大堆的警告是不要管的。估计等1小时不到的时间,就彻底编译好了。你能够发如今C盘出现了:   C:Boost   它下面有Include和Lib目录。你可使用这个C:Boost,使用它的静态或动态库。也可使用C:OpenSourceboost_1_35_0下的源代码。   5)结束也是开始BOOST之旅   好了,开始你的boost之旅吧。我用它的graph库实现了最短路径,整个上海的路网,4万多条路段,任意2点查询最短路径,不超过3秒就OK。内存消耗在30M左右。今后我喜欢上了boost。   最新的BOOST提供了C++和Python的接口,这也是我要用它的理由。一个简单的比喻,C++比如COM,Python比如JavaScript,若是你认为JavaScript调用COM能够产生强大的威力,是原子弹的话,那么Python调用C++则是氢弹。关于Boost.Python的知识,参考:   http://www.cppblog.com/jinq0123/archive/2008/05/29 /BuildingHybridSystemswithBoostPython_c.html   固然,我仍是以为上述过程太复杂,在Windows上使用Boost,你能够彻底忽略上面的过程,到下面这个连接里直接取得一个下载软件,它会给你下载你要的包:   http://www.boostpro.com/products/free   最近作开发碰到了长字符串匹配、搜索的问题,最早想到的是使用正则表达式,简单、高效。   可是我用的开发工具是VC6.0,不支持正则表达式。   上网baidu一下,发现支持正则的库还真很多,大概有如下几种:boost,GNU,VC7带的ATL中的和微软发布的greta。   网上的朋友对boost评价不错,决定就使用是它了!   一、接下来的就是下载boost库,网上很好找。我下载的是压缩包,20多M,解压后将近100多M。   我解压的目录是D:\boost   二、而后是编译,我只要支持正则表达式就能够,所以只须要编译D:\boost\libs egex\build目录下的文件。听说所有编译要花将近2个小时,没有验证过,在我家里的机器上编译正则表达式部分只用了不到5分钟。   网上介绍的如何编译最多的一篇文章是“VC利用boost库解析正则表达式”,若是有人能根据这篇文章编译成功不妨告诉小弟一声……   如下是个人操做:   在“运行”里输入“cmd”,打开命令提示符;   输入命令“cd D:\boost\libs egex\build”//设置当前目录   输入命令“D:”//转到当前目录   接下来是很关键的一步:   不少文章是这样说的“输入 nmake -fvc6.mak”   可是出现了“'nmake' 不是内部或外部命令,也不是可运行的程序或批处理文件。”的错误提示。   而后你就会拼命查找缘由,结果又有文章上说是环境变量没配置好,而后给出一堆“set”。   也有的文章说是运行一下visual studio安装目录下的VC98\Bin\VCVARS32.BAT文件就OK了。   你按照文章做者的方法作的,结果发现问题依旧!   以上说法都是正确的,可是说得都不是很完整,出现错误提示的根本缘由就是环境变量没配置好,不识别nmake命令,配置过jdk的朋友就很容易明白。若是按照做者的要求搞一堆“set”,未免大题小做了吧,由于咱们只须要用一次'nmake' 就能够解决问题了。   VCVARS32.BAT正式配置环境变量的批处理文件,可是配置的参数只在当前窗口有效,也就是说当你双击运行后窗口关闭,环境变量已经没有了。   因而我用了如下方法:   把VCVARS32.BAT文件用鼠标拖到打开的cmd窗口("D:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"),而后回车。   输入命令“nmake -fvc6.mak”   等待几分钟,OK了!,D:\boost\libs egex\build多了一个vc6的文件夹,里面是不少lib和dll文件。 [b]三、到此资源已经准备好了,下面要作的工做是配置VC6.0,使它编译使时候能找到正则库。 [/b]   把vc6下的全部lib和dll文件拷贝到Visual Studio安装目录下的VC98\boostRex(boostRex是我本身建的)   而后打开vc6.0,选择“Tools->Options->Directories->Include files”,加入一行“D:\BOOST”   选择“Tools->Options->Directories->Library file”,加入一行“C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\BOOSTREX”(彩色部分是个人Visual Studio安装目录)   配置也OK了! SDK下的测试:   #include "stdafx.h"   #include   #include   #include   #include   #include   using namespace std;   using namespace boost;   regex expression("^select ([a-zA-Z]*) from ([a-zA-Z]*)");   int main(int argc, char* argv[])   {   std::string in;   cmatch what;   cout "enter test string" endl;   getline(cin,in);   if(regex_match(in.c_str(), what, expression))   {   for(int i=0;ip>   cout   }   else   {   cout   }   return 0;   }   输入: select name from table   输出: str:select name from table   str:name   str:table   MFC下的测试(有几个地方要注意,下面有提示):   新建一个对话框的MFC工程,   加入头文件   #include   在按钮鼠标单击事件响应函数中加入   boost::regex expression("^select ([a-zA-Z]*) from ([a-zA-Z]*)");   CString in = "select gm from tab";   CString sRet;   boost::cmatch what;   if(boost::regex_match(LPCSTR(in), what, expression))//CString转string   {   for(int i=0;ip>   sRet = (what.str()).c_str();//string转CString   MessageBox(sRet);   }   }   else   {   MessageBox("Error Input");   }   输出的结果跟上面同样。