1.boost库的链接.http://hi.baidu.com/zwbdb/item/4ccd238774416829110ef3dc
boost库使用了一种自动链接技术,通过分析编译器设定的工程选项自动选择库进行链接。例如:
新建一个VC工程,右击项目,选择属性->配置属性->C/C++->代码生成->运行时库。如果选择非动态链接库(MT, MTD),boost自动链接对应的静态库,否则(MD, MDD)会链接动态库,用户在在链接选项中手动设置的boost库被忽略。
具体链接的库名也是有boost\config\auto_link.hpp中的预编译宏自动生成,如果发现boost链接了不正确的库,应该仔细分析该文件。
总之,配置boost项目的库链接不是通过配置链接器,而是通过编译器的预编译选项和预编译宏实现的。
再举一个例子:使用VC编译boost相关工程常见的一个错误是,选择MDD库编译时,报找不到boost库的错误,分析auto_link.hpp可知,在MDD选项打开时,预编译宏_DLL被设置,在auto_link.hpp的294行有如下代码:
#if ((defined(_DLL) || defined(_RTDLL))) && defined(BOOST_DYN_LINK)
#define BOOST_LIB_PREFIX
#elif defined(BOOST_DYN_LINK)
#error "Mixing a dll boost library with a static runtime is a really bad idea..."
#else
#define BOOST_LIB_PREFIX "lib"
#endif
由于BOOST_DYN_LINK未设置,导致库名前缀宏BOOST_LIB_PREFIX被定义为"lib",而boost动态链接库的库名默认是没有lib前缀的,如是会导致上述链接错误。只要在编译器预编译头中定义宏BOOST_DYN_LINK即可解决该问题
2.记boost应用中的几个有用的宏 http://blog.csdn.net/billdavid/article/details/3886775
BOOST_ALL_DYN_LINK 动态链接boost,而不是默认的静态链接。
BOOST_LIB_DIAGNOSTIC 输出链接boost库的信息,便于开发者确认是否链接与期望的一致,且到底是哪个文件用到了相应的boost库。
此外,在$BOOST_DIR/boost/config/auto_link.hpp及$BOOST_DIR/boost/config/user.hpp中还提到了很多其他有用的宏,不妨一看。