boost配置(VC/CodeBlocks)与编译(bjam+msvc/mingW)



转载自:http://rendao.org/blog/264/

                                                    BJAM编译、配置和说明

先了解下bjam

bjam是专门为boost库设计的make工具,boost源码中没有编译完成的bjam,只有源码,需要先编译出bjam,然后才能用bjam编译boost下的众多的库,当然也可以用来编译你自己的工程。但是,boost下各种编译工程支持的编译平台琳琅满目,现在还不一定选bjam呢。

 

选择bjam+XX作为boost编译平台的理由

Win下C++程序员通常使用VC作为开发工具,在以下几方面做了比较之后我们在决定要不要使用VC编译BOOST

IDE:vc2012的巨型IDE太慢(除非花几大千升级电脑),而CodeBlocks不需要高硬件配置

GUI:MFC代码不能跨平台,而wxWdigets可以

boost支持的编译器:由于STL的支持等等原因boost新版本支持vc2012或者gcc,但不支持vc6

鉴于我的苦逼电脑上无法顺畅的跑vc2010的巨型IDE,加上用wxWidgets代替MFC的趋势,我没有用单纯的vc IDE+vc编译器,而是选择了bjam+mingW或者bjam+vc编译器,这就是引入bjam的原因

注意,谁编译谁调用,vc编译的boost库在vc工程中调用,mingW编译的boost库在mingW工程中调用。

有编译好的的现成bjam.exe,为何还要自己编译?

bjam在boost源码中一起提供,需要编译才能使用,下载boost的时候会提示下载一个编译好的bjam,据说不很推荐,用下载来的bjam编译boost可能出现一些错误,而用自己编译的bjam却顺利完成。有人说是不同版本对目录分隔符的使用不同,不管啦。

 

bjam编译目录说明

bjam的编译一般用到一个build.bat文件,boost_1_34_1下该bat文件的目录为“boost_1_34_1\tools\jam\src”,在高些的版本下可能为“boost根目录\tools\build\v2\engine\src”,而更高些的版本则干脆变成了“boost根目录\booststrap.bat”,连bat的文件名都变了,但依然是专用来生成bjam的,届时小变通一下同样可以编译bjam。本文以boost_1_34_1版本为例。

 

bjam编译准备,设置编译器路径(可选步骤)
可选,因为看你想要拿来编译bjam的编译器是否可以被build.bat找到,如果你的vc是默认路径安装的或者自定义安装路径但加入了环境变量PATH,如果你的mingw/gcc是默认安装路径或者加入了环境变量PATH,这一步都不用啦,bat会自动搜索VC/Mingw/gcc的常规安装目录的,可以直接第2步了。但如果你的编译器未纳入环境变量,则要在此bat中指定具体路径
打开build.bat ,其中ProgramFiles变量默认等于“C:\Program Fils”,把它改为编译器的具体目录,注意是目录,不是编译器的文件路径,编译器的名字是在第二步执行build.bat ***时,星号部分指定的

 

必做:bjam编译
cmd下切换到build.bat所处的目录(本文采用的是boost_1_34_1/tools/jam/src),执行“build.bat msvc”或者“build.bat mingw”或者“build.bat gcc”,编译成功就会在build.bat相同目录下创建bin.ntx86目录并生成bjam.exe,注意:1、键入命令中“.bat”可以省略,2、参数msvc等也可省略(采用默认),3、参数若采用mingw只能是小写,4、编译bjam的地方可以用mingw是因为这个bat支持此参数,实际上内部遇到此参数还是调用的gcc.exe,若是用bjam+mingw编译boost时则没有mingw的编译器选项,只有gcc

 

必做:bjam加入环境变量

将bjam.exe拷贝到boost_1_34_1/bin,将bin目录完整路径增加到电脑的环境变量-系统变量-PATH,这样的话,cmd下直接输入bjam就可以调用boost_1_34_1/bin/bjam.exe啦

 

关于bjam命令的参数说明

以如下两行命令为例,解释下参数含义

bjam stage –toolset=msvc-9.0 –stagedir=”C:\SDK\boost\bin” link=staticruntime-link=shared threading=multi debug release

bjam stage –toolset=msvc-9.0 –stagedir=”C:\SDK\boost\bin” link=staticruntime-link=static threading=multi debug release

stage/install: stage表示只生成库文件(dll 和 lib),而 install 还会生成包含头文件的 include 目录(本人选择了 stage 模式,编译完毕后手动将压缩包中的 boost_1_34_1\boost目录拷贝到编译好的库文件所在的根目录下)。

toolset: 顾名思义,是用来指定你是在为哪个编译器编译 boost,比如msvc-6.0或msvc-9.0或gcc,注意,mingw下要用gcc,并没有mingw选项

stagedir/prefix:stage 模式中使用 stagedir,install 模式中使用 prefix,表示编译生成的文件路径。本人指定的是 C:\SDK\boost\bin,你可以根据个人喜好更改这个目录。编译后的库文件所在目录就是 C:\SDK\boost\bin\lib。(前面所说的拷贝 boost 目录,就是将 boost 目录拷贝到 C:\SDK\boost 下)

link:生成动态链接库/静态链接库。动态使用 shared,静态使用 static。因 boost 属于第三方库,所以一般使用静态方式,本人就只编译了静态方式。

runtime-link:动态/静态链接运行时库。同样可以选择 shared 和 static 两种方式,本人编译了这两种。

threading:单/多线程模式。本人编译的多线程方式,即 multi,若需要编译单线程模式,则指定为 single 即可。

debug/release:编译 debug/release 版本。

 

 

BOOST环境配置

vc6的boost环境配置

首先,从官网下载boost的压缩包,解压,以版本1-34-1为例,解压之后后有个boost_1_34_1目录,把改目录拷贝到某处,比如E:\,由于boost库应用广泛,所以当作sdk一样安装到vc6中

然后,打开VC6,工具-选项-目录-Include Files,加入一行“E:\boost_1_34_1”,工具-选项-目录-Library Files,加入一行“E:\boost_1_34_1\bin”,注意,默认是没有bin这个目录的,但为了把编译得到的boost下的所有lib、dll文件集中管理,所以都放到这里吧

OK

 

CodeBlocks的boost环境配置

待续

 

bjam+vc(编译器)/ mingW编译BOOST

 

关于boost版本

本文以boost_1_34_1版本为例,编译更高版本时,用到的bjam命令是一样的

 

确认编译环境

bjam环境:请再次确认bjam.exe已编译并加入环境变量的PATH中,验证方法是进入cmd后直接键入bjam回车,如果加入成功会有bjam的提示文字。

msvc编译器:vc++正确安装时会自动加入环境变量的,不同的msvc版本,在bjam命令上只时个vc版本号的区别而已

mingw/gcc编译器:进入cmd窗口,键入gcc –v,若gcc正确加入环境变量的PATH,应该会提示版本信息,否则请参考CodeBlocks+mingW的安装和环境配置过程

 

编译单一库的方法
以thread为例,thread下没有提供vc6直接编译的dws工程,所以采用用bjam+vc6编译器或者bjam+mingw。
cmd下切换目录至boost_1_34_1/,用VC6就键入“bjam –build-type=complete toolset=msvc-6.0 stage –with-thread”,用MingW就键入“bjam –build-type=complete toolset=gcc stage –with-thread”,编译成功,注意,键入命令写法不固定,参数顺序可以调整,boost_1_34_1/bin.v2/libs/thread/build/msvc-6.0或者gcc-mingw-4.4.1目录下会生出debug和release的静态库动态库。如果要编译其他的库,把上面cmd命令中的thread替换即可,注意,用MingW时toolset指定为gcc而不是mingw,否则无法编译

 

编译整个boost的方法
cmd下,目录切换到boost_1_34_1,用vc6就键入“bjam –build-type=complete toolset=msvc-6.0 stage”,用MingW就键入“bjam –build-type=complete toolset=gcc stage”

 

编译出来的文件放到哪里?

正确编译之后,在boost_1_34_1目录下新建一个bin目录,把所有编译生成的lib、dll文件(注意,是所有的,不要因为lib文件比dll文件要多就只拷贝成对出现的lib、dll)拷贝到bin目录

 

编译出来的文件名的含义

以date_time库为例,编译共生成16个库文件:
libboost_date_time-mgw44-1_46.a
libboost_date_time-mgw44-1_46.dll
libboost_date_time-mgw44-1_46.dll.a
libboost_date_time-mgw44-d-1_46.a
libboost_date_time-mgw44-d-1_46.dll
libboost_date_time-mgw44-d-1_46.dll.a
libboost_date_time-mgw44-mt-1_46.a
libboost_date_time-mgw44-mt-1_46.dll
libboost_date_time-mgw44-mt-1_46.dll.a
libboost_date_time-mgw44-mt-d-1_46.a
libboost_date_time-mgw44-mt-d-1_46.dll
libboost_date_time-mgw44-mt-d-1_46.dll.a
libboost_date_time-mgw44-mt-s-1_46.a
libboost_date_time-mgw44-mt-sd-1_46.a
libboost_date_time-mgw44-s-1_46.a
libboost_date_time-mgw44-sd-1_46.a
如上,mgw44代表编译器Mingw4.4版本:
mt: threading=multi
s: runtime-link=static
d: variant=debug
.dll: link=shared
.dll.a: 对应DLL的导入库文件

 

补充个比较笨的编译单个库的方法,不推荐,每次要找具体模块的目录这样不累吗

以thread为例
cmd下切换目录至boost_1_34_1/libs/thread/build,然后执行bjam编译命令,有人说是“bjam  bjam –toolset=msvc-6.0”,但会提示出错“notice: could not find main target  bjam”“don’t know how to make bjam”等等,因为多些了一个bjam,实际上采用如下命令就可以啦,“bjam –toolset=msvc-6.0”,编译成功后就会在boost_1_34_1/bin.v2/libs/thread/build/msvc-6.0/debug/threading-multi下面生成boost_thread-vc6-mt-gd-1_34_1.dll和boost_thread-vc6-mt-gd-1_34_1.lib库,可以给VC6.0使用。

 

补充个纯VC6(IDE+编译器)编译boost::regex的方法,不推荐,不是所有的库都可以用此方法

VC6下只可使用支持VC6的最后一个版本,如果不想升级编译器就选用1.34.1版本吧。打开boost根目录\libs\regex\build,找到文件vc6.mak,用VC6打开这个文件,填写个dsp工程名称,编译,等待几分钟,OK啦,找到lib和dll文件了吧。

如果编译时报错“fatal error U1050: Variable MSVCDIR not set.”,那就在我的电脑的环境变量-系统变量中添加名为MSVCDIR的变量,值等于C:\Program Files\Microsoft Visual Studio\VC98

正确编译regex库之后,在类似boost_1_34_1\libs\regex\build\vc6这样的目录下可以得到lib和dll文件,把所有的lib、dll文件拷贝出来,注意,是所有的,不要因为lib文件比dll文件要多就只拷贝成对出现的lib、dll,拷贝之后在boost_1_34_1目录下新建一个bin目录,把刚拷贝的文件粘贴到这里

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