成长的印记

我的编程感悟

安装Boost

对于vs2003.net,如果只安装boost 相对比较简单,可以跳到步骤2,这里要安装boost 的stlport 版本。即同时安装stlport 和 以stlport 为标准库编译 boost .
1、先安装stlport
进入stlport/src 目录
运行nmake –f vc71.mak install
这样默认stlport头文件放入
..../Microsoft Visual Studio .NET 2003/Vc7/include/stlport 目录
在vc 的工具-〉选项-〉项目-〉vc++目录 中设置stlport头文件目录。
注意目录位置要放在vc 头文件链接的上面,这样#include 标准库是优先选择了stlport 而不是 vc 自带的stl .
lib 自动拷贝到了vc7/lib 中可以不用设置。

对于5.02 版本,src目录中没有makefile 文件, 有cmd控制台进入build/ lib 目录,执行完 configure.bat 然后再对vc71.mak 进行 make

2、编译boost,  先编译bjam:
a 运行tools/build/jam_src/build.bat,然后会看见 bin.ntx86目录,里面有bjam.exe

b设置环境变量 如: 
PATH= e:/boost1.32.0/boost/tools/build/jam_src/bin.ntx86
 或者把bjam 拷贝到boost 根目录

SET VC71_ROOT=
"C:/Program Files/Microsoft Visual Studio .NET 2003/Vc7"
这个也可以不用设置。

使用vc提供的工具 visual studio.net 2003 命令提示控制台,进入boost目录:执行

bjam  "-sTOOLS=vc-7_1 " install

便可把相关的头文件和编译后的库文件默认安装到c:/boost。如果不使用stlport 对于vc2003安装就这么简单,


对于支持stlport 的boost 安装执行

bjam "-sTOOLS=vc-7_1-stlport" "-sSTLPORT_PATH=E:/STLPort
"-sSTLPORT_VERSION=4.6.2" stage
我安装的stlport是4.6.2版本的,注意上面指定的stlport目录和版本,在编译过程中会出错但能编译完。
如:F:/boost/boost_1_32_0/boost/lexical_cast.hpp(150) : error C2679:
还有其他一些原因不能编译出来的库。
大部分安装都会有这个问题,可以添加 "-sBUILD=<native-wchar_t>off" 选项关闭编译时的/zc:wchar_t选项
bjam "-sTOOLS=vc-7_1-stlport" "-sBUILD=<native-wchar_t>off"  "-sSTLPORT_PATH=E:/STLPort" "-sSTLPORT_VERSION=4.6.2"  stage
注意按照上面 stlport  lib 的目录是在
E:/STLPort/stlport-4.6.2/lib ,后面数字是版本号指定的目录中的数字

编译后在boost 根目录出现一个stage 目录,里面是所有编译过的库。我的stlport 版本有158个文件,vc 200多一些,可见stlport 有些库没出来,多半是跟wchar_t有关的。

完成后可以测试下面的程序
#include "stdafx.h"
#include <iostream>
#include <boost/regex.hpp>
#include <boost/thread.hpp>

int main()

    // 3 digits, a word, any character, 2 digits or "N/A", 
    // a space, then the first word again
    boost::regex reg("//d{3}([a-zA-Z]+).(//d{2}|N/A)//s//1");   
    std::string correct="123Hello N/A Hello"; 
    std::string incorrect="123Hello 12 hello";   
    assert(boost::regex_match(correct,reg)==true); 
    assert(boost::regex_match(incorrect,reg)==false);
    boost::regex reg1("(new)|(delete)");
    boost::smatch m;std::string s=  "Calls to new must be followed by delete. /  Calling simply new results in a leak!";
    if (boost::regex_search(s,m,reg1))
    {  // Did new match? 
        if (m[1].matched)   
            std::cout << "The expression (new) matched!/n"; 
        if (m[2].matched)   
            std::cout << "The expression (delete) matched!/n";
    }
    return 0;
}

注意编译debug 版本设置工程-〉c++ -> 命令行附加选项加入 /GX  /D_STLP_DEBUG。代码生成-〉运行时库必须选择多线程版本的, 没有
/D_STLP_DEBUG  编译时回停留在这里
elif defined(_DEBUG)
#            define BOOST_LIB_RT_OPT "-gdp"
#            pragma message("warning: STLPort debug versions are built with /D_STLP_DEBUG=1")
#            error "Build options aren't compatible with pre-built libraries"
#        else
#            define BOOST_LIB_RT_OPT "-p"

如果没有指定使用多线程版本,编译会提示你缺少libboost_regex-vc71-sgdp-1_xx_1.lib 的库,其实默认编译没有这个库。可能指定一些编译参数会有吧. 如果不指定多线程的话。stlport 的库也有链接问题。这些库基本都是多线程版本的(不代表线程安全)。最好指定为多线程动态库 /md 或 /mdd 版本。静态库编译出来太大了

对于test 库,程序能编译但不能链接,对于vc自带stl 与stl port 都一样,不知道哪里需要设置。里面有些文件直接在vc工程中都不能编译,可能版本还不是太好,错误如下
test_tools::tt_detail::check_impl  , 搜搜网上存在这样问题的不少。这样BOOST_CHECK 之类的宏就不能使用了
error LNK2019: 无法解析的外部符号 "void __cdecl boost::test_tools::tt_detail::check_impl(class boost::test_tools::predicate_result const &,class boost::basic_wrap_stringstream<char> &,class boost::unit_test::basic_cstring<char const >,unsigned int,enum boost::test_tools::tt_detail::tool_level,enum boost::test_tools::tt_detail::check_type,unsigned int,...)" (?check_impl@tt_detail@test_tools@boost@@YAXABVpredicate_result@23@AAV?$basic_wrap_stringstream
@D@3@V?$basic_cstring@$$CBD@unit_test@3@IW4tool_level@123@W4check_type@123@IZZ)

阅读更多
个人分类: Boost
上一篇vc的hash_map怎么啦
下一篇Boost Graph Library 快速入门
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭