Apr 9, 2009

boost 安装(VC 和 mingw)

1. 下载 boost src
2. 编译 bjam (最好自己编译,否则可能出错),执行 d:\boost_1_45_0\tools\build\v2\engine\src\build.bat 即可,或者搜索 build.bat
3. 将 bjam.exe 加入系统路径
4. 进入 D:\boost_1_37_0,执行 bjam --help
5. 选择合适的命令进行编译

推荐 
D:\boost_1_43_0>bjam --prefix=D:\boost toolset=msvc link=shared threading=multi runtime-link=shared install
(可以选择 variant,但是推荐 debug和release都选)

6. 编译完成,将 D:\boost\include\boost-1_37 目录和 lib 目录加入 VC 路径
7. 如果选择动态链接,则把 lib 目录加入系统路径,修改boost/config/user.hpp, uncomment #define BOOST_ALL_DYN_LINK




关于 link 和 runtime-link 设置,二者的关系和区别,我至今还是搞不懂。不过最好都是设成 shared 就行了。

link:生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用 static方式。这里需要注意的是,static方式下,最终生成的很多静态链接库大小都在几兆、几十兆,甚至接近百兆。这么大的库我们一般是不会采用 静态链接方式的,所以这些库不推荐以static方式编译(without掉);如果已经编译了赶快删,肯定没用,否则将占用近1G的硬盘空间。以下是巨 型库黑名单:wave、graph、math、regex、test、program_options、serialization、signals。
runtime-link:动态/静态链接C/C++运行时库。同样有shared和static两种方 式,这样runtime-link和link一共可以产生4种组合方式。虽然它和link属性没有直接关系,但我们习惯上,一个工程如果用动态链接那么所 有库都用动态链接,如果用静态链接那么所有库都用静态链接。所以这样其实只需要编译2种组合即可,即link=shared runtime-link=shared和link=static runtime-link=static。

link=static runtime-link=static 得到 libboostxxxxx.lib
link=shared runtime-link=shared 得到 boostxxxx.lib 和 boostxxxx.dll
由以上的文件夹层次结构基本就可以得出结论:
1、以“lib”开头的是“link-static”版本的,而直接以“boost”开头的是“link-shared”版本的。
2、有“d”的为debug版本,没有的则是release版本。
3、有“s”的为“runtime-link-static”版本,没有的则是“runtime-link-shared”版本。
4、有“mt”的为“threading-multi”版本,没有的则是“threading-single”版本。


使用举例:
#include <boost\thread.hpp>

Boost 采用了 auto-link 机制,因此不用在工程文件或 makefile 中写入 lib 文件,auto-link 机制将会自动帮我们包含对应的 .lib 文件。

需要注意的是 boost 默认是以静态方式链接的。这是由<boost/config/user.conf>这一文件控制的,如果想修改默认链接方式,就修改如上文件。

一般的,如果在自己的工程里想使用dll动态方式链接,预先定义宏:
#define BOOST_ALL_DYN_LINK
同样,此时boost也会默认帮我们包含对应的lib。

如果不想使用boost提供的auto-link机制,或者对它的自动链接不太放心的话(其实大可不必担心),可以预先定义宏:
#define BOOST_ALL_NO_LIB

然后使用以下方法链接:
#pragma comment(lib, "boost_thread-vc90-mt-1_39.lib")

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

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

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

MingW 下编译安装和上面一样,除了如下区别
1. sh build.sh 编译 bjam
2. toolset=gcc, prefix 设成 /user/local,如果不设置,默认为 C:\boost
3. mingw 不支持 auto linking,因此必须加 -llibname

0 comments: