首页 > 代码库 > Win7+vs2010下安装boost_1_46_1库

Win7+vs2010下安装boost_1_46_1库

一、boost库分类:

(1)不需要编译库:any、array、asio、conversion、crc、bind/mem_fn、enable_if、function、lambda、mpl、smart_ptr...

(2)需要编译的库:date_time、filesystem、function_types、graph、iostreams、math、mpi、program_options、python、regex、serialization、signals、system、test、thread、wave

二、完全编译boost将要依赖的一些官方库:

(1)Regex所需Unicode支持类库 -- ICU ,编译ICU较为简单,解开ICU包之后,在其目录下可以找到一个叫"allinone"的目录,用Visual studio或者visual studio express打开里面的allinone.sln,选择release,即可以编译完成,编译之后,将include目录和lib目录下的库文件拷贝出来,分别放在C:\icu\include和C:\icu\lib。

(2)Graph所需的XML处理类库 --Expat,下载expat-win32bin-2.0.1安装到C:\expat即可。

(3)MPI所需MPI类库 -- Boost的官方站点说需要MPICH或OpenMPI之类的支持,事实上在Windows下总是会提示需要MPIC++,你需要的是Microsoft Cluster Pack SDK,下载并默认安装在C:\ProgramFiles\Microsoft Compute Cluster Pack下。(说明:如果安装Microsoft HPC Pack 2008 SDK或Microsoft Compute ClusterPack时不是装到默认的路径下,那bjam就会抓瞎,找不到mpic++的路径,这时候可以修改一下mpi.jam(在boost_1_46_1\tools\build\v2\tools): local cluster_pack_path_native = "你的路径")

(4)Python所需Python语言库--Python,下载Python 2.7.1 Windows Installer,安装到C:\

三、编译boost库:

1.下载安装包boost_1_46_1 选择下载windows版本

2.解压缩到D:\boost目录下

3.运行bootstrap.bat

(1)从vs2010的工具菜单进入命令提示窗口(单击“开始”按钮,指向“所有程序”,指向“Microsoft Visual Studio 2010”,指向“Visual Studio tools(工具)”,然后单击“Visual Studio 2010 command prompt(命令提示)”
(2)cd到D:\boost\boost_1_46_1下执行bootstrap.bat,然后,会在d:\boost\boost_1_46_1\下生成bjam.exe

4.设定编译环境(加入红色字体)    
修改user-config.jam (d:\boost\boost_1_46_1\tools\build\v2\user-config.jam) 的MSVC configuration  

# MSVC configuration      
# Configure msvc (default version, searched in standard location # and PATH).   
# using msvc ;   
using msvc : 10.0 : : <compileflags>/wd4819 <compileflags>/D_CRT_SECURE_NO_DEPRECATE
<compileflags>/D_SCL_SECURE_NO_DEPRECATE <compileflags>/D_SECURE_SCL=0 ;

要支持mpi,你可以添加一行“using mpi ;”即可

5.cd到D:\boost\boost_1_46_1下执行 
编译boost库命令:

bjam install -s HAVE_ICU=1 -s ICU_PATH=C:\icu --toolset=msvc-10.0 --build-type=complete link=static runtime-link=static --prefix="E:\boost\boost_1_46_1" threading=multi

variant=release

(这一步需要等待很长时间,大概一个小时左右……)

下面详细解释一下每个参数的含义:
stage/install:stage 表示只生成库(dll和lib),install还会生成包含头文件的include目录。推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录,所以可以直接使用,而且不同的IDE都可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。

toolset:指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-10.0(VS20010)等。

without/with:选择不编译/编译哪些库,不需要的可以without掉。这可以根据各人需要选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,要先下载python。

stagedir/prefix:stage 时使用stagedir,install时使用prefix,表示编译生成文件的路径。(说明:使用install时,include文件目录结构是这样的E:\boost\boost_1_46_1\include\boost_1_46_1\boost,路径很累赘,可以去掉中间一层\boost_1_46_1。不管怎样,个人觉得还是使用stage好,一方面是快,另一方面也没这么纠结的目录)

build-dir:编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录下,目录名为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版本,所以两个都编译。

 

如果不选择安装Python,两步:

(1)bjam --without-python --toolset=msvc-10.0 --build-type=complete

        --prefix="E:\boost\boost_1_46_1" install

(2)bjam --with-python --toolset=msvc-10.0 --build-type=complete

        --prefix="E:\boost\boost_1_46_1" install

6.设定vs2010环境

(注:在2010环境下这步,在项目-->右键属性-->VC++ Directories 中去填写对应路径 )   
Tools -> Options -> Projects and Solutions -> VC++ Directories   
在Library files加上E:\boost\boost_1_46_1\lib   
在Include files加上E:\boost\boost_1_46_1\include

 

 

相关:

使用举例:

  #include<boost\thread.hpp>

  此时,不用包含库文件,boost的auto-link机制将会自动帮我们包含对应的静态lib。也就是说,boost默认是以静态方式链接的,这样我们的工程属性最好也设为Multi-threaded (Debug)。如果想使用dll动态方式链接,需要预先定义宏:

  #define BOOST_ALL_DYN_LINK

  同样,此时boost也会默认帮我们包含对应的lib。如果不想使用boost提供的auto-link机制,或者对它的自动链接不太放心的话(其实大可不必担心),可以预先定义宏:

  #define BOOST_ALL_NO_LIB

  然后使用以下方法链接:

  #pragma comment(lib, "boost_thread-vc100-mt-1_46.lib")或

  #pragma comment(lib, "boost_thread-vc100-mt.lib")

  这两个lib其实是一样的,实在不明白boost编译时为什么每个库都要复制一份,难道是因为后者在升级boost版本后不用改代码?另外还有一个比较有用的宏:

  #define BOOST_LIB_DIAGNOSTIC

  它可以让VC在编译时的output窗口中输出程序具体链接了哪些boost库以及链接顺序。

  关于boost的auto-link机制,详细可以看看boost\config\auto_link.hpp里的代码,很容易可以读懂,并且值得我们学习。

  

另:Linux下编译与配置的区别:

  我的Linux与Windows使用了共享目录,将Windows下的E:\SDK目录映射成了Linux下的/mnt/hgfs/sdk目录。

  所以我的boost源文件根目录就是/mnt/hgfs/sdk/boost_1_45_0,cd进去。

  首先需要编译bjam:

  cd tools/jam

  ./build_dist.sh

我在虚拟机的Linux下编译bjam的时候最后会卡住,屏幕显示到mkdir的地方就不往下走了,不过其实这时候bajm已经编译完成。

  接下来将stage/bin.linuxx86目录下生成的bjam拷贝到boost源文件根目录boost_1_45_0下,cd进去,开始编译boost:

  ./bjam stage --toolset=gcc --with-date_time --with-thread --with-filesystem --with-program_options --stagedir="/mnt/hgfs/sdk/boost_1_45_0/bin/gcc" link=static runtime-link=static threading=multi debug release

  这些参数的意义与Windows下完全一样,只不过编译器改成gcc,其他选项根据自己的需要进行设置。

  生成的库文件就在bin/gcc/lib目录下,与vc10编译的一样,lib目录感觉是多余的,手动将库文件拷贝到gcc目录下,删掉lib目录,这属于个人喜好问题。

  然后把中间文件全部删掉,包括bin.v2目录和tools/jam/stage目录。

  关于boost库的使用,为了不用每次写makefile都把boost的头文件和库文件的路径带着,而且为了让跨平台程序公用一套代码,

  可以将boost的头文件和库文件路径加到Linux的环境变量中。打开/etc/profile,加入以下gcc环境变量:

  CPLUS_INCL?_PATH=$CPLUS_INCL?_PATH:"/mnt/hgfs/sdk/boost_1_45_0"

  export CPLUS_INCL?_PATH

  LIBRARY_PATH=$LIBRARY_PATH:"/mnt/hgfs/sdk/boost_1_45_0/bin/gcc"

  export LIBRARY_PATH

  这样就可以直接使用boost的头文件和库文件了,并且与Windows共用一套代码,非常方便。