技术开发 频道

VC.NET 2005(VC8)编译boost 1.31

  【IT168 技术文档】

  一、下载安装:

  下载boost 1.31,解压缩至一个文件夹,本文以[boost-path]来引用这个路径。

  二、编译准备工作:

  首先是编译jam,在< boost-path >\tools\build\v1下,把vc7.1-tools.jam文件复制一份,改名为vc80-tools.jam,我暂时未测试stl-port。

  修改文件内容里的路径,这个根据你的安装路径来改。去掉几个flag行,以后编译时就少一些警告。修改以后内容如下:

extends-toolset msvc ;

# singleton variables...
set-as-singleton VC80_ROOT ;

if ! $(MSVCDir)
{
ProgramFiles ?= $(PROGRAMFILES) ;
VC80_ROOT ?= $(ProgramFiles:J=" ")\\Microsoft Visual Studio 8\\VC" ;
VC_TOOL_PATH = "$(VC80_ROOT)\\bin\\ ;
VC_SETUP = "CALL \"$(VC_TOOL_PATH)VCVARS32.BAT\" >nul" ;
}
VC_PDB_NAME = vc80 ;
flags vc80 C++FLAGS on : /Zc:wchar_t ;

  然后打开VC2005程序组里面的Visual Studio Command Prompt,这能确保已加载环境变量,减少后面一些操作过程。在[boost-path]\tools\build\jam-src目录下运行:

build -sTOOLS=vc80

  编译会通过的,最后链接时会报错,之后想到的方法如下:

.\bootstrap.vc7\jam0 -f build.jam --toolset=vc7 "--toolset-root=C:\Program Files\Microsoft Visual Studio 8\VC"

  注:这个选项不能直接附加在build批处理后面,所以要这样调用。

  好了,bjam编译完成。下面编译boost,有2个文件需要改一下:

  [boost-path]\boost\config\auto_link.hpp在第118行附近改为:

#elif defined(BOOST_MSVC) && (BOOST_MSVC == 1310)

// vc71:
# define BOOST_LIB_TOOLSET "vc71"

#elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1400)

// vc80:
# define BOOST_LIB_TOOLSET "vc80"

  注:如果你不修改这里,那么后面测试时无法链接到正确的lib,因为前面我们已经使用了“VC.NET 2005”,生成的lib全是VC.NET 2005的。

  [boost-path]\boost\config\compile\visualc.hpp最后面的>1310改为1400,如下:

#if (_MSC_VER?> 1400)

  注:如果不修改这个,无法正确生成所需要的lib。

  这些文件修改就完成了。如果你需要boost-python,那么还需设置几个环境变量,注意路径替换为你自己的,版本号只留前2位,比如2.3.4,则只需要写上2.3。

SET PYTHON_ROOT=c:\soft\python24
SET PYTHON_VERSION=2.4
SET PYTHON_LIB_PATH=c:\soft\python24\libs

  三、编译:

  以上过程都完毕了,现在转到[boost-path]目录下,运行如下命令:

tools\build\jam_src\bin.ntx86\bjam -sTOOLS=vc80 "-sBUILD=debug release static/dynamic single/multi"

  编译完成以后,设置VC2005的include和lib路径,最好搜索一下*.lib,拷到一个文件夹下,接下来就可以测试了。

  四、测试:

  写了一段测试正则表达式的代码,编译、链接,结果是报错。原来是要链接多线程版本!在VC2005里找了一下,发现只有多线程选项,单线程竟然没有列进来。

  这中间我走了一点弯路,试图编译一个多线程版本的boost,结果发现不行,编译出来还是单线程的,就线程库是多线程版本。

  最后用了个蠢办法:在#include < stdafx.h >后面加上一句:#undef _MT,终于可以运行起来了。

  五、补充说明:

  如果系统中有MSVCDir 这个环境变量,VC80_ROOT这个变量将会被忽略掉。由于vc2005对C++的标准库增加了更严格的安全性检测,所以在VC2005里使用boost会得到很多假的警告,可以通过定义 _SCL_SECURE_NO_DEPRECATE 或者加入#pragma warning(disable:4996)来处理掉,另外一些是因为某些老的C库函数被VC2005声明为deprecated(不赞成使用的),例如fopen, str*字符串函数等。

0
相关文章