VC8(VC2005)下编译boost 1_33_1

boost 1_33_1的文档里说支持VC2005,但是编译boost时,并不支持VC8,昨天我花了一个下午加半个晚上的时间终于搞定。记下来,以防不测。

在VC8编译boost的问题主要出现在无法使用VC8编译bjam,编译不出bjam就无法编译boost。因此需要让boost的编译工具bjam知道VC8,知道如何使用VC8。,为此需要添加适合VC8的toolset,我们把它命名为"vc-8_0"。我们可以模仿boost支持VC7的方式让他支持VC8,模仿Toolset  vc7编写"vc-8_0"。

1 在"$boost_dir/tools/build/jam_src"下,用文本编辑器打开批处理文件"build.bat",找到" :Guess_Toolset"(大约在48行)一节,在行"if NOT "_%VS71COMNTOOLS%_" == "__" ( "前添加

if NOT "_%VS80COMNTOOLS%_" == "__" (
    set BOOST_JAM_TOOLSET=vc-8_0
    set BOOST_JAM_TOOLSET_ROOT=%VS80COMNTOOLS%/../../VC/
    goto :eof)
setlocal & endlocal
if NOT "_%VCINSTALLDIR%_" == "__" (
    set BOOST_JAM_TOOLSET=vc-8_0
    set BOOST_JAM_TOOLSET_ROOT=%VCINSTALLDIR%/VC/
    goto :eof)
setlocal & endlocal

通过上面这段代码,能够使boost知道VC8的安装路径.

2  在"build.bat"的:Setup_Toolset"(201行)一节,添加Toolset,在237时VC7的Toolset,模仿这个可以写出VC8的Toolset,复制/粘贴那三个if语句将vc7修改为vc-8_0, 如下:
if "_%BOOST_JAM_TOOLSET%_" == "_vc-8_0_" (
    if NOT "_%MSVCDir%_" == "__" (
        set BOOST_JAM_TOOLSET_ROOT=%MSVCDir%/) )
if "_%BOOST_JAM_TOOLSET%_" == "_vc-8_0_" (
    if EXIST "%BOOST_JAM_TOOLSET_ROOT%bin/VCVARS32.BAT" (
        call "%BOOST_JAM_TOOLSET_ROOT%bin/VCVARS32.BAT" ) )
if "_%BOOST_JAM_TOOLSET%_" == "_vc-8_0_" (
    if not "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" (
        set PATH=%BOOST_JAM_TOOLSET_ROOT%bin;%PATH%)
    set BOOST_JAM_CC=cl  /GZ /Zi /MLd -DNT -DYYDEBUG kernel32.lib advapi32.lib
    set BOOST_JAM_OPT_JAM=/Febootstrap/jam0
    set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap/mkjambase0
    set BOOST_JAM_OPT_YYACC=/Febootstrap/yyacc0
    set _known_=1
)

3   在"$boost_dir/tools/build/jam_src"下,用文本编辑器打开文件"build.jam",大约181行是vc7的Toolset, 复制/粘贴那几行代码,将vc7修改为vc-8_0,就成为vc-8_0的Toolset,如下
## Microsoft Visual C++ 8
toolset vc-8_0 cl : /Fe : -D
    : /nologo
    [ opt --release : /ML /O2 /Ob2 /Gy /GF /GA /GB ]
    [ opt --debug : /MLd /DEBUG /Z7 /Od /Ob0 ]
    : kernel32.lib advapi32.lib ;

根据实际情况的需要修改上面的编译选项,因为上述编译选项有的在VC8下会被忽略。另外,类似strcpy 之类的函数被VC8声明为否决的,这样会出现许多编译警告。

4  打开"Visual Studio 2005 命令提示"改变目录到"$boost_dir/tools/build/jam_src" ,运行"build.bat"待编译完成之后,在"$boost_dir/tools/build/jam_src/bin.ntx86"下生成 bjam.exe.

生成bjam.exe后就可以按照,网上介绍的方法编译boost库,参看文章"boost编译简明教程",引用自http://www.fopen.org/bbs/viewthread.php?tid=1372:

*****************************

boost编译简明教程

 boost编译。没啥新东西,老生常谈。

先给出英文的编译帮助,有什么不明白的或者我没说清楚的请查阅并确认。
www.boost.org/more/getting_started.html
或者你的boost的安装路径下的more/getting_started.html这里以1.33.1为例。
1.下载boost包,并解压到某个文件夹下。这里用为方面起见$boost_dir代替,在说明路径的地方如果出现了$boost_dir请用实际的boost的解压路径替代。
注:如果你下载了boost的一些增补包,这些包一般是在boost从上一个大版本到新大版本之前被收录的一些新的库或者是新的编译工具,例如新的bjam。请不要以为是重名而把同名文件夹覆盖了。看准合适位置解压就是了。
2.打开命令行工具。以下的主要工作都将在命令行中进行。
3.首先是编译jam工具。
3.1 使用命令行
  SET PATH=%PATH%;$boost_dir/tools/build/jam_src/;
设置环境变量。这一步也可以在“我的电脑点右键->属性->高级->环境变量->user variable或system variable中"设置,而且是永久性的。使用set设置的环境变量只对当前命令行有效。
3.2  运行build.bat。在命令行中查看结果。如果结果显示“update 1 targets successful"这样的信息,则表明编译成功。此时“$boost_dir/tools/build/jam_src/”文件夹可发现一个新的文件夹btn.x86,在里面可以发现bjam.exe。(不知道会不会有btn.x64文件夹。。。我是X86的机器,不太清楚)
  将这个文件夹也添加到环境变量中。
  SET PATH=%PATH%;$boost_dir/tools/build/jam_src/btn.x86;
3.3 如果没能成功编译bjam,则可能是编译器的设置问题。对于Visual C++(2005Express有点特殊)编译器,找到common7/tools/vcvars32.bat,把它拖到命令行窗口中,运行一下,然后再执行build.bat。对于2005 Express,这个编译器携带的是精简的编译环境,你可以同样找到vcvars.txt,然后更名为vcvars.bat,按照刚才的方式执行一边即可。
4.bjam编译好后,就可以利用它编译库文件了。将命令行的工作目录放置到$boost_dir下,然后执行一下bjam --help,看能否正确的执行bjam.exe。如果提示找不到文件,将bjam所在的路径添加到环境变量path中,实在不行就把bjam复制到$ boost_dir下。
5.如果试图使用boost.python库,则需要添加安装python,并设置对应的环境变量,这里的root对应的是你的python的安装路径,ver对应的是你的python版本。
SET PYTHON_ROOT=X:/Python2.3.4
SET PYTHON_VERSION=2.3
6.如果使用了boost.iostreams的compress或者unicode功能,请参阅对应的提示。通常你需要zlib和icu这两个库。
7.编译选项:
选项参见$boost_dir/more/getting_started.html,这里有详细的说明,以下仅列举一个很具代表性的选项。

bjam -sBOOST_ROOT=. -sTOOLS=vc-7_1 --with-thread "-sBUILD=debug release <runtime-link>static/dynamic"

上面的命令行设置环境变量BOOST_ROOT为当前路径,使用Visual C++ 7.1编译器,仅编译thread库(因为完整的编译耗时很长,所以建议使用--with-<library_name>来编译指定库。类似的还有--without-<library_name>选项)。

编译好的库都在$boost_dir/bin下。你可以进去搜索所有的lib/dll文件然后剪切出来放到一个文件夹中,再把其他的中间文件删掉就好了。
类似的你还可以编译其他的类库,具体的库可能需要依赖一些其他的库,你可以参见库的编译说明。另外生成的库运行时链接情况也是不一样的,例如有的库不能支持静态链接。这一点请详细阅读帮助文件。
8.使用:
这里可能不太好举例。先将$boost_dir加入到编译器的include目录列表中。然后我编译好了thread库,并且将所有的相关文件都统一放置到了$boost_dir/bin/thread/目录下,我便可以在我的工程中将该目录添加到链接文件的路径中。然后依据情况选择是否手工添加库文件。在帮助的“Automatic Linking on Windows”一节,文档说,很多需要编译的库,boost都使用了#pragma指示字指明了库名称,也就是说只需要加上库所在的路径就好了。
最后是关于运行时库的问题。最好把你的工程选用的CRT与编译boost库时使用的CRT一致起来。这一点可以根据boost文件的名称判断。否则的话可能会出现内存的使用错误(尤其是分配和释放不在一个堆的时候更是如此)。

最后是一篇中文文档。这篇也不错。如果不清楚,E文也不是太好的可以参看它
http://blog.csdn.net/billdavid/archive/2005/03/07/313347.aspx

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值