`

Boost库编译后命名方式

阅读更多
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标记:编码了影响库和其他编译代码交互的细节。对于每一种特性,向标记中添加一个字母:
Key Use this library when:
s 静态链接到C++标准库和编译器运行时支撑库
g 使用标准库和运行时支撑库的调试版本
y 使用Python的特殊调试构建
d 构建代码的调试版本
p 使用STLPort标准库而不是编译器提供的默认库
n 使用STLPort已被弃用的“native iostreams”
-1_34
版本标记:完整的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)多线程



需要注意的是,链接时,所使用的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>

关于此宏的解释参见 http://www.boost.org/doc/libs/1_38_0/libs/regex/doc/html/boost_regex/configuration/linkage.html

转自: http://www.cnblogs.com/dementia/archive/2009/04/10/1433217.html
分享到:
评论

相关推荐

    Boost编译好的库和头文件及一个例子C++

    4. 按照Boost的命名规则使用库:例如,使用`boost::regex_match`进行完全匹配,`boost::regex_search`进行部分匹配。 通过提供的资源,开发者可以快速地在VC6环境下搭建起使用Boost的开发环境,尤其是对于正则...

    boost python1.47编译的动态库文件

    在标题中提到的"boost python1.47编译的动态库文件"是指Boost.Python库的1.47版本,该版本已经针对Visual Studio 2010 (即VC10)进行了编译。动态库文件(DLLs)是运行时所需的,它们包含了可执行代码,可以在程序...

    C++参考手册中文版chm以及Boost库中文版chm

    Boost库是C++社区开发的一个开源库,它提供了一系列经过精心设计和广泛测试的C++模板库,极大地扩展了C++的功能。The Boost C++ Libraries中文版.chm涵盖了以下关键模块: 1. **智能指针**:如shared_ptr、unique_...

    Boost1.55 VC11 动态库

    这个列表可能包含了一系列以"BoostVC11"命名的文件或文件夹,这些是专门为Visual Studio 2012(VC11)编译的Boost1.55动态库文件。这些文件可能包括.lib(导入库)和.dll文件,它们是实际在运行时由应用程序加载的库...

    C++Boost的Regex库用法

    编译成功后,需要将生成的库文件和头文件目录添加到项目的链接器设置和包含路径中,这样才能在项目中使用Boost Regex库。 在Visual Studio中集成Boost库需要设置项目的包含目录和库目录,并且可能需要调整链接器...

    VS2008下编译好的Boost的regex库

    总之,VS2008下的预编译Boost.regex库为开发者提供了一种方便的方式来利用Boost的强大功能,而无需处理复杂的编译过程。通过正确配置项目设置,开发者可以快速地在项目中集成和使用正则表达式功能,从而提高开发效率...

    编译Boost1.38

    为了编译Boost 1.38,首先在D盘根目录创建一个目标安装文件夹,例如命名为`D:\BoostLib1_38`。然后,在Boost根目录下执行`bjam install --prefix="D:\BoostLib1_38"`命令,开始编译过程。此处使用了`debug`模式,...

    C++元编程和Boost编程库

    Boost库是C++标准库以外的一个广泛使用的、跨平台的、开源的编程库集合,它包含了一系列以Boost命名的C++库。这些库覆盖了各个领域,包括字符串处理、泛型编程、并发编程等。在元编程方面,Boost库提供了元编程库...

    已编译好的正则表达式库(VC6.0)(boost源码)

    总的来说,"已编译好的正则表达式库(VC6.0)(boost源码)"为那些仍在使用老版本编译器的开发者提供了一种便捷的方式,使他们能够享受到现代正则表达式库的强大功能,而无需自己解决编译问题。通过这个库,开发者可以...

    boost正则库使用说明

    ### Boost正则库使用说明详解 #### 一、概述与配置 Boost正则库(Boost.Regex)是Boost库中的一个重要组成部分,它提供了一套强大的正则表达式处理功能。该库支持多种正则表达式的语法,包括Perl风格、POSIX扩展...

    boost1.65.1_MinGW(动态/静态库)

    总的来说,Boost1.65.1_MinGW压缩包为Windows下的C++开发者提供了一个全面的、预编译好的Boost库集合,无论你是需要调试还是发布,动态链接还是静态链接,都可以在这里找到适合的库文件。通过合理选择和使用这些库,...

    没有boost命名空间的Boost.PFR.zip

    Boost.PFR库的核心功能是提供了一种方式来直接访问和比较结构体或类中所有基本类型成员的值,而无需显式地编写getter和setter。这对于元编程、序列化、反射等功能非常有用,尤其是在需要快速访问和比较大量结构数据...

    boostLib163_release_x64版本

    "boostLib163_release_x64版本"指的是Boost库的一个特定构建,针对64位(x64)操作系统,并且是用于发布模式(release)的编译版本。这个版本通常会优化性能,减少调试信息,适用于部署到生产环境。 1. **Boost库介绍**...

    vc6.0 boost 图片设置

    完成编译后,Boost库将生成包含头文件、库文件和源文件的目录。这些文件通常位于"include"、"stage\lib"等子目录下。在VC6.0中,我们需要把这些目录添加到项目设置中,以便编译器和链接器能找到Boost的相关文件。 ...

    Boost.Asio C++ 网络编程 中文版

    - **依赖**:Boost.Asio依赖Boost库,后者是一个广泛使用的C++库集合。 - **编译Boost.Asio**:需要配置编译器以链接Boost库。 - **重要的宏**:例如ASIO_STANDALONE,用于独立编译。 - **同步VS异步**:在讨论网络...

    boost_python静态库vs2003

    通过这种方式,你可以在VS2003环境中利用Boost_Python静态库与Python 2.5.6进行无缝交互。虽然这些工具和库的版本相对较旧,但它们仍然在某些场景下有其价值,尤其是在维护旧代码或与特定系统兼容时。理解如何配置和...

    C++11 下使用 Boost.Serialization 库实现智能指针的序列化

    Boost.Serialization库是C++社区广泛使用的序列化工具,它提供了丰富的功能来处理各种类型的对象,包括智能指针。在C++11及更高版本中,智能指针(如`std::unique_ptr`,`std::shared_ptr`和`std::scoped_ptr`)被...

    IFCPlusPlus编译.rar_IfcPlusPlus_编译

    编译成功后,你可以通过编写简单的测试程序来验证IFCPlusPlus是否能够正常工作。例如,创建一个读取IFC文件并打印其基本信息的程序,这有助于确认IFCPlusPlus已经被正确编译和链接。 总的来说,编译IFCPlusPlus涉及...

Global site tag (gtag.js) - Google Analytics