- 浏览: 13139 次
最新评论
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
直接指定编译器以完全模式编译即可,这样可以满足今后的一切使用场合,但同时带来的后果是:
1、占用3G以上的硬盘空间
2、占用若干小时的编译时间
3、头文件和库文件存放于C:\Boost(个人非常反感)
4、生成的很多文件可以永远也用不上
首先下载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. int 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评价不错,决定就使用是它了!
1、接下来的就是下载boost库,网上很好找。我下载的是压缩包,20多M,解压后将近100多M。
我解压的目录是D:\boost
2、然后是编译,我只要支持正则表达式就可以,因此只需要编译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文件。 3、到此资源已经准备好了,下面要做的工作是配置VC6.0,使它编译使时候能找到正则库。
把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");
}
输出的结果跟上面一样。
发表评论
-
VC:文件操作大全,打开,保存,复制,删除,查找等
2012-01-20 02:00 631VC:文件操作大全,打开,保存,复制,删除,查找等 2010 ... -
bada学习之HelloWorld篇
2012-01-20 02:00 527bada学习之HelloWorld篇 201 ... -
MFC类库的产生与发展
2012-01-20 02:00 626MFC类库的产生与发展 20 ... -
手工编译Android程序
2012-01-20 02:00 665手工编译Android程序 2011年01月19日 赖锋 ... -
Python中cx_Oracle模块安装遇到的问题与解决方法
2012-01-19 09:48 1091Python中cx_Oracle模块安装遇到的问题与解决方法 ... -
win下配置Apache+Python
2012-01-19 09:48 489win下配置Apache+Python 2011年10月13 ... -
全能选手 看看Python应乎潮流的72变
2012-01-19 09:48 600全能选手 看看Python应乎潮流的72变 2010年10月 ... -
windows上python2.6安装mysql
2012-01-19 09:48 644windows上python2.6安装mysql ... -
Python2.6+PyQt4.8+eric4+汉化+开发教程
2012-01-19 09:48 1111Python2.6+PyQt4.8+eric4+汉化+开发教程 ... -
OCI
2012-01-17 02:21 549OCI 2011年12月05日 OCI编程的一般过程 ... -
编译cs文件
2012-01-17 02:21 516编译cs文件 2012年01月01日 第一种方法:用. ... -
[评论]Flash,Silverlight,Win32:2011三大垂死平台
2012-01-17 02:21 616[评论]Flash,Silverlight,Win32:201 ... -
基于X的GNOME、GTK、GDK、XLib、GLib等之间的关系(转)
2012-01-17 02:21 679基于X的GNOME、GTK、GDK、XLib、GLib等之间的 ... -
3.1 MFC概述
2012-01-17 02:21 6183.1 MFC概述 2009年12月01 ... -
灯饰英语
2012-01-15 22:00 476灯饰英语 2011年12月02日 ... -
sysytem32下的文件及其作用的文章
2012-01-15 22:00 487sysytem32下的文件及其作用的文章 2011年11月2 ... -
ITV常见故障错误代码(中兴平台)
2012-01-15 22:00 758ITV常见故障错误代码(中 ... -
服务器端发送推送数据
2012-01-15 22:00 536服务器端发送推送数据 ... -
Java语言11个主要特性
2012-01-15 22:00 466Java语言11个主要特性 20 ...
相关推荐
1.将boost文件夹完整拷贝到VC6编译环境Include目录下 例如:C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE 2.将lib文件夹内部所有.lib文件拷贝到VC6编译环境lib目录下 例如:C:\Program Files\Microsoft ...
在visual studio tool(这个工具我是在下面图片找到的)里面,用cd xxx找到boost解压的位置,然后用bootstrap.bat,我遇到了下面这个错误: Failed to build Boost.Build engine. Please consult bootstrap.log for ...
最近项目中使用boost库的智能指针,感觉智能指针还是蛮强大的,在此贴出自己学习过程中编写的测试代码,以供其他想了解boost智能指针的朋友参考,有讲得不正确之处欢迎指出讨论。当然,使用boost智能指针首先要编译...
由于在超级计算机上对某些系统配置进行更改后,vina的原始编译停止工作,因此我不得不通过从源代码构建程序来解决该问题。 最困难的问题是找到兼容的64位数学库(libm.a,libpthread.a,libc.a),以及g ++编译器和...
使一些或所有控制路径显式详细,以帮助进行代码正确性审核,这与因可能从任何地方抛出异常而导致的隐藏控制路径相反。 禁止使用例外情况进行编译的公司政策。 维护从未考虑过异常安全性的代码库。 程序/框架的...
利亚普诺夫 一个用于数值积分非线性动力学系统的库。... 这可能会使将编译的求解器链接到Boost库的正确版本变得很棘手。 如果您在使用该工具时遇到任何问题,请给我发送电子邮件或创建github问题,我们将为您提供帮
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...
因为,LuaBind库会在编译时生成所需的代码.这样做的不利点是,编译时间会随着需要注册的 文件的数目增加而增加.因此建议你把所有的需要注册的东西放到一个cpp文件里面. LuaBind 遵循 MIT 协议 发布. 我们非常希望...
这上传的资源中包含一套我工作中常用的模板库,及不需要MFC支持的excel操作接口,导出函数调用栈(dump stack)接口,可以直接用VS2008运行TestCodeLib.sln来根据unit test来了解用法。 ⑴ 需求(requirements) 重量级...
只对solver.hpp进行了solver.hpp修改: 在Solver类定义中,ApplyUpdate函数必须从保护状态移到公共状态在Solver类定义中,必须将iter_从protected移到public 还使用了OpenCV和boost,但是如果您有Caffe,则应该已经...
附近- 分散式实时图像处理管道设计文档: : usp 阶段1 [x]: 完成管道API阶段2 [WIP]: 使用类型系统在编译时验证管道的正确性第三阶段[加标]: 分发建造该项目是针对C ++ 17,OpenCV 4.0和Boost 1.67开发的。...
首先通过以下方式在本地系统中编译项目: make clean make 有关测试是否可行的信息,请参见下面的运行测试 运行测试 对于自动化测试,请运行: make script 它会生成随机数并测试基本操作是否正确执行 对于手动...
这是MORB的官方资料库,MORB是基于ORB的多尺度二进制描述符,可提高尺度变化下特征匹配的准确性。 MORB使用预定义像素对中强度比较的正确定向采样模式描述了不同比例的图像块。 对于此多尺度描述符,我们还提出了一...
MVP:多核虚拟平台概述MVP是基于SystemC的多核全系统仿真... 编译之前,编辑Defs.mk以包括SystemC的正确路径。 $ make pb -j4 # build for Realview Platform Baseboard with ARMv7-A ISS $ make vb -j4 # build for CA
要进行编译,首先需要确保已安装Boost库。 完成后,只需运行make.sh: bash make.sh 跑步 要生成对完整SHA-1算法的原像攻击进行编码的CNF实例,请运行: ./main --cnf --rounds=80 --hash-bits=160 > instance....
DFT的matlab源代码波形图 2012年至2014年由俄亥俄州立大学的Paul Schellin撰写。 波形是一个C ++仅标头库,将波形/信号...11支持进行编译(您可以通过添加-std=c++11假设已经使用FFTW3并对其进行了正确配置,则将其设置
LL(1)语法分析器,用Skinmagic做界面,VC++,用Boost库正则式来判断输入是否正确。
Psi是一个任意维C ++数组的库。 轻松定制,无需重写或复制。 可以在编译时或在运行时指定尺寸。 Psi数组是正确的对象,包括算术运算等。Boost License。
条款18:让接口容易被正确使用,不易被误用 make interfaces easy to use correctly and hard to use incorrectly. 条款19:设计class犹如设计type treat class design as type design. 条款20:宁以pass-by-...