VS2008下Boost库的安装编译(2)

下表是对Regex库编译后的文件名:

文件名   含义   编译使用该库的程序时应使用的编译选项  
libboost_regex-vc90-mt-sgd-1_38.lib   静态库,多线程,调试版本
使用静态调试版本C运行时库(LIBCMTD.LIB和LIBCPMTD.LIB)
  /MTd  
libboost_regex-vc90-mt-s-1_38.lib   静态库,多线程
使用静态版本C运行时库(LIBCMT.LIB和LIBCPMT.LIB)
  /MT  
libboost_regex-vc90-mt-gd-1_38.lib   静态库,多线程,调试版本
使用动态调试版本C运行时库(MSVCRTD.LIB和MSVCPRTD.LIB)
  /MDd  
libboost_regex-vc90-mt-1_38.lib   静态库,多线程
使用动态版本C运行时库(MSVCRT.LIB和MSVCPRT.LIB)
  /MD  
boost_regex-vc90-mt-gd-1_38.lib   导入库(boost_regex-vc90-mt-gd-1_38.dll),多线程,调试版本      
boost_regex-vc90-mt-1_38.lib   导入库(boost_regex-vc90-mt-1_38.dll)多线程      

需要注意的是,链接时,所使用的Regex库文件名必须和编译选项匹配,否则会造成如下链接错误:

LINK : warning LNK4098: defaultlib '×××××' conflicts with use of other libs; use /NODEFAULTLIB:library

原因是,当编译时,cl.exe(也就是VC的编译器)会根据上述编译选项在编译成的obj文件中植入相应的defaultlib文件名(使用DUMPBIN /DIRECTIVE ***,lib可以查看),如/MT对应的就是LIBCMT.LIB(C)和LIBCPMT.LIB(C++标准库)。当链接器处理该obj文件时,会从文件中取出该defaultlib文件名,将其放在命令行库列表的最后以供使用。对于静态库的处理也是如此,静态库也是由一些obj文件组成的,每个obj文件中也根据当时的编译选项被植入了相应的defaultlib。当链接器处理静态库时,也会将涉及到的obj文件中的defaultlib放在命令行库列表的最后。假设,我们的程序使用/MT编译,那个对应的defaultlib就是LIBCMT.LIB(C)和LIBCPMT.LIB(C++标准库)。而使用的是libboost_regex-vc90-mt-sgd-1_38.lib,它对应的defaultlib就是LIBCMTD.LIB和LIBCPMTD.LIB。链接过程中,链接器会发现采用了不同的运行时库,所以会出现上述错误。

幸运的是,Visual C++支持自动链接,当包含Regex的头文件时,Regex会根据当前工程的编译选项(不同的编译选项会定义不同的宏,具体参见上一篇C运行时库)自动告诉编译器将哪个文件送给链接器。

Boost.Regex默认使用的静态链接方式,如果希望使用动态链接方式,如何实现呢? 定义宏BOOST_REGEX_DYN_LINK。要注意,一定要在包含regex头文件之前定义该宏:

#define BOOST_REGEX_DYN_LINK
#include
<boost/regex.hpp>

关于此宏的解释参见

Boost 的详细介绍请点这里
Boost 的下载地址请点这里

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/939f67f12e88be14e17898daca9330c3.html