Boost.Log v2 : 3.安装
来源:互联网 发布:wsn网络分析器 编辑:程序博客网 时间:2024/05/22 03:04
安装及兼容性
平台和编译器
本程序库可以编译运行在各主流编译器上。在以下平台都编译成功且通过了测试:
- Windows XP, Windows Vista, Windows 7. MSVC 8.0 SP1, MSVC 9.0 及以上版本。
- Linux. GCC 4.5 及以上版本. 旧版本GCC应该也可以用,但尚未试过。
- Linux. Intel C++ 13.1.0.146 Build 20130121。
- Linux. Clang 3.2 及以上版本。
不支持以下平台,在这些平台上编译很可能会失败:
- 包含有非标准C++11 程序库的C++11 编译器(例如Clang 搭配GCC 4.2版本的 libstdc++)。拜托,在C++11 模式下开发时请用标准C++11 程序库。
- MSVC 8.0 (没有SP1补丁包)及以下版本。
- GCC 4.2及以下版本。
- Borland C++ 5.5.1 (免费版),更高版本能否支持尚不确定。
- Solaris Studio 12.3 及以下版本。
- Windows 9x, ME, NT4, 2000 及以下版本。
对Boost 支持的所有硬件架构,Boost.Log 都是兼容的。但请注意,对32 位x86 架构,本库的最低硬件要求是i586 CPU。
GCC 用户
从4.5版本开始,GCC 支持链接时优化(LTO),这种情况下大多数优化和二进制码的生成都是在链接时期完成。这有助于执行许多高级优化并能提升代码运行效率。但不幸的是,在一些对源码有不同优化项要求的项目中LTO 表现不佳,而Boost.Log 恰巧是其中之一,她有一些文件对现代CPU 做了优化表述,但这些表述不适于那些老CPU。如果启用LTO,编译得到的Boost.Log 无法兼容老CPU(GCC bug),在运行时往往会导致崩溃。这个问题在GCC 5.1及以上版本中已经修复。因此,对于低于5.1版本的GCC Boost.Log不提供LTO支持。
在使用-march=native 参数编译时,有个GCC 的bug 会导致编译失败。我们的建议是避免使用-march=native 参数进行编译(bjam 属性中也不要用instruction-set=native),并显示指明目标CPU架构(例如,instruction-set=sand-bridge)。
MinGW, Cygwin 及 Visual Studio Express Edition 用户
使用这些编译器前要做些准备工作。首先,如果是MinGW 或Cygwin 用户请首先确认安装使用了最新版本的GCC。如果用GCC 3.x 版本做编译,十有八九会失败。
其次,本库有时会用到Message Compiler(mc.exe),但MinGW、Cygwin和一些版本的MSVC Express Edition 不提供此工具。程序库编译脚本会自动探测系统中有没有可用的Message Compiler,如果没有则会禁用Event Log 相关功能。如果要用Event Log 但又没装Message Compiler,你有3条路可以走,我们推荐的一条是搞个原版的mc.exe。Windows SDK 里就有这个程序,从Microsoft 网站上下载SDK 是免费的(例如,用这个)。在Visual Studio 2010 Express Edition 中也包含此工具。别忘了在PATH 环境变量中包含mc.exe 的路径,编译时要用到。
另一条路是尝试MinGW 或Cygwin 中发行的windmc.exe,这个是原版mc.exe 的模拟程序。如果走这条路你需要对Boost.Build 文件打补丁(具体而言,文件 tools/build/tools/mc.jam),这里有方法。打完补丁就可以用mc-compiler=windmc 告诉bjam 去编译程序库了。
如果因为某些原因,Message Compiler 检测失败了,你可用在编译库文件时指明禁用Event Log 后端,添加宏定义BOOST_LOG_WITHOUT_EVENT_LOG 就行了。这样就移除了对Message Compiler 的依赖。(关于配置项的更多细节,其他章节里会有描述。)
Windows XP 上的MinGW 用户可能会被msvcrt.dll 中bug 影响,msvcrt.dll 是绑定在操作系统上的。这个bug 反应为在格式化log 条目时库代码会崩溃。不是只有Boost.Log 才有这个问题,其他一些和本地化及IO流管理有关的应用场景中也会有此问题。
Cygwin 用户补充
Cygwin 提供的支持十分有限。Cygwin 中默认的GCC 版本(本文写作时是4.5.3版)因编译器错误无法编译程序库。你必须从源码开始重新编译GCC。即便如此一些Boost.Log 的功能仍然不可用。具体而言,基于socket 的syslog 后端不可用,因为它基于Boost.ASIO,而后者在Cygwin 环境中是编译不了的。但原生的syslog 仍可以工作。
配置及编译
本程序库包含有需要单独编译的部分,编译方法见Getting Started。需要说明的是,如果在您的项目中有不止一个使用Boost.Log 的模块(比如一个.exe文件和多个dll文件),应该编译使用共享库。如果您只有一个可执行文件或一个单独的模块使用Boost.Log,编译静态库也是可以的。
编译库时使用如下宏定义做配置:
表1.1. 宏配置
BOOST_LOG_USE_BOOST_REGEX
BOOST_LOG_USE_BOOST_XPRESSIVE 只影响库编译。这些宏用来指定解析字符串和设置时Boost.Log 使用std::regex 还是Boost.Regex 或是Boost.Xpressive。如果不定义她们,Boost.Log 默认会使用Boost.Regex。使用std::regex 或Boost.Regex 能产生明显小些的可执行文件,Boost.Regex 通常在运行时是最快的。使用Boost.Xpressive 可以排除对Boost.Regex 库的依赖。要注意的是,这些宏不会影响用户创建的过滤表达式。
你可以在使用bjam 命令行时定义这些宏配置项,比如:
bjam –with-log variant=release define=BOOST_LOG_WITHOUT_EVENT_LOG define=BOOST_USE_WINAPI_VERSION=0x0600 stage
但是在 boost/config/user.hpp 文件中定义这些宏会更方便一些,这样做能同时在库工程和用户项目中使能宏。如果一个宏也不定义,库工程会尝试用最合情理的配置,包括支持各种字符类型和目标平台可用的特性。
本库用到的其他Boost 库也需要编译。她们是Boost.Filesystem,Boost.System,Boost.DateTime,Boost.Thread 和Boost.Regex(如果配置的话)。她们的具体编译事项要看各自文档。
最后,还有一件事要做。日志库需要运行时类型信息(RTTI),在编译库文件和用户代码时都要使能她。通常,只要检查你的工程中没有禁用RTTI就行了。
注释:编译器内置的TLS功能
许多广泛使用的编译器都内置有管理线程局部存储(TLS)的功能,这个功能在库的许多地方都会被使用。这个特性也是C++ 11标准的一部分。
通常这些内置功能会允许更高效的访问存储空间,要比其他途径例如Boost.Thread 甚至原生的系统API 还要高效。然而,使用这个特性还要注意以下几点:
- 有些操作系统不支持以动态链接库的形式使用TLS,动态库是在程序运行时才加载的。这些操作系统包括Linux 和低于Windows Vista 的Window 版本操作系统。Windows Vista 及更新的Windows 操作系统没有这个问题。
- 在全局变量的构造和析构函数中使用TLS 是不可靠的。至少在MSVC 8.0 上这是个已知问题。
程序库提供了BOOST_LOG_USE_COMPILER_TLS 宏配置来使能TLS,你可以用她来提升运行效率,但要遵守下面的规则:
- 应用程序必须要链接Boost.Log 库,而不能在运行时动态加载她。
- 在全局的构造和析构函数中不能写日志。
要注意BOOST_LOG_USE_COMPILER_TLS 只能控制Boost.Log 使用TLS 但其他被用到的库是不受控制的。比如Boost.ASIO会默认使用TLS。如果要让Boost.Log 完全脱离编译器内置的TLS, 在其他库里也要禁用她(对Boost.ASIO 可以在编译和使用时定义BOOST_ASIO_DISABLE_THREAD_KEYWORD_EXTENSION )。
注释:对wchar_t 的支持
对一些编译器尤其是MSVC,有选项禁用原生的wchar_t 类型,她会用typedef 来模拟wchar_t。从C++ 语言的视角看这是欠妥的,但对于兼容那些难以更新升级的旧代码这是有用的。
Boost库(当然也包括Boost.Log)默认以支持原生wchar_t的方式编译。本文写作时,用户还需要修改Boost.Build才能开启模拟方式。您可以让Boost.Log以模拟wchar_t方式工作,但务必牢记以下几点:
编译期配置决定了编译后Boost.Log二进制文件中的导出符号。用户代码必须使用和编译Boost.Log时相同的配置,否则会出现链接错误。
因为在模拟方式中wchar_t型和整型是无法分辨的,部分库行为会和使用原生wchar_t的正常模式有所不同。特别是宽字符文字(译者:比如中文)有可能会被拒绝使用或出现另类格式化。
模拟方式未通过全面测试,可能会出现意外。因此不鼓励使用模拟方式,我们应该尽量避免使用它。在未来版本中有可能不再支持模拟方式。
翻译:Lanser@csdn.net
声明:本文旨在技术交流,可以转载,但如果是商业用途请务必和原作者确认。本人保留追诉权利。
- Boost.Log v2 : 3.安装
- Boost.Log v2 : 1.序言
- Boost.Log v2 : 4.定义
- Boost.Log v2 : 2.如何阅读
- Boost.Log v2 : 5.设计概要
- boost log
- boost::log
- 【Developer Log】Log4j v2
- Boost.log的编译
- Boost.log的应用
- Boost.log的应用
- Boost log库
- boost log库
- boost log 中的几个问题
- BOOST Log 使用 Unicode
- boost.log要点笔记
- boost log库
- Boost Log 基本用法
- 09-Oracle入门之多表查询
- 在Dreamweaver中创建的html标记含义
- 问题 B: 分组统计
- 免费web直接打印的控件PAZU
- 超越影像——RSNA 2016参展随感 (三.完结)
- Boost.Log v2 : 3.安装
- swift 简单倒计时
- JAVA编程规范总结
- matlab的安装以及初步使用
- Android工具:被你忽视的Lint
- 上下文菜单
- 快速上手BS项目的要素
- node.js入门实践
- SQL Join的一些总结(实例)