【C++】boost名称含义
2014-01-06 16:17
330 查看
Boost官网的《Geting Started On Windows》(http://www.boost.org/doc/libs/1_38_0/more/getting_started/windows.html)提到了Boost库的命名,摘录如下:
以 libboost_regex-vc71-mt-d-1_34.lib 为例:
lib
前缀:除了Microsoft Windows之外,每一个Boost库的名字都以此字符串开始。在Windows上,只有普通的静态库使用lib前缀;导入库和DLL不使用。
boost_regex
库名称:所有boost库名文件以boost_开头。
-vc71
Toolset 标记:标识了构建该库所用的toolset和版本。
-mt
Threading 标记:标识构建该库启用了多线程支持。不支持多线程的库没有-mt。
-d
ABI标记:编码了影响库和其他编译代码交互的细节。对于每一种特性,向标记中添加一个字母:
-1_34
版本标记:完整的Boost发布号,下划线代替点。例如,1.31.1版本将被标记为“-1_31_1”。
.lib
扩展名:取决于操作系统。在大多数unix平台上,.a是静态库,.so是共享库。在Windows上,.dll表示共享库,.lib是静态或导入库。
下表是对Regex库编译后的文件名:
需要注意的是,链接时,所使用的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头文件之前定义该宏:
[cpp]
view plaincopyprint?
关于此宏的解释参见 http://www.boost.org/doc/libs/1_38_0/libs/regex/doc/html/boost_regex/configuration/linkage.html
以 libboost_regex-vc71-mt-d-1_34.lib 为例:
lib
前缀:除了Microsoft Windows之外,每一个Boost库的名字都以此字符串开始。在Windows上,只有普通的静态库使用lib前缀;导入库和DLL不使用。
boost_regex
库名称:所有boost库名文件以boost_开头。
-vc71
Toolset 标记:标识了构建该库所用的toolset和版本。
-mt
Threading 标记:标识构建该库启用了多线程支持。不支持多线程的库没有-mt。
-d
ABI标记:编码了影响库和其他编译代码交互的细节。对于每一种特性,向标记中添加一个字母:
Key | Use this library when: |
s | 静态链接到C++标准库和编译器运行时支撑库 |
g | 使用标准库和运行时支撑库的调试版本 |
y | 使用Python的特殊调试构建 |
d | 构建代码的调试版本 |
p | 使用STLPort标准库而不是编译器提供的默认库 |
n | 使用STLPort已被弃用的“native iostreams” |
版本标记:完整的Boost发布号,下划线代替点。例如,1.31.1版本将被标记为“-1_31_1”。
.lib
扩展名:取决于操作系统。在大多数unix平台上,.a是静态库,.so是共享库。在Windows上,.dll表示共享库,.lib是静态或导入库。
下表是对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)多线程 |
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头文件之前定义该宏:
[cpp]
view plaincopyprint?
#define BOOST_REGEX_DYN_LINK #include <boost/regex.hpp>
关于此宏的解释参见 http://www.boost.org/doc/libs/1_38_0/libs/regex/doc/html/boost_regex/configuration/linkage.html
相关文章推荐
- C++元编程和Boost编程库 (C++ Metaprogramming and Boost MPL )中部
- VS2010 C++环境下DLL和LIB文件目录及名称修改
- c++中使用boost::regex(由于标准库中版本过低,导致不支持多行,需手动编译添加最新版的boost库)
- C++学习 boost学习之-shared_array
- C++ boost 正则表达式用法
- C++中extern “C”含义深层探索
- C++元编程和Boost编程库 (C++ Metaprogramming and Boost MPL )
- C++ 排序函数 sort(),qsort()的含义与用法 ,字符串string 的逆序排序等
- C++如何截取不带后缀的图片名称
- C++ Primer Plus 第9章 内存模型和名称空间
- C++箴言:理解typename的两个含义
- c++ boost--------------boost::progress_timer小试。
- C/C++: C++ 中 static_cast 类型转换的含义
- C++ 结合 Boost:40行代码读写和处理 txt 文件
- C++的Json解析库:jsoncpp和boost .
- (转)C++中extern “C”含义深层探索
- Boost.Asio c++ 网络编程翻译(17)
- 如何在C++代码中调用python代码(MinGW+Boost.Python)
- C++ Boost 学习资源列表
- 版本名称的英文缩写代表的含义