ICC 编译 Google Mock 和 Google Test 的问题

最近发现 Google Test (Google C++ Testing Framework 的非正式称谓) 非常受欢迎,很多公司的研发团队都在使用它编写 C++ 测试案例。其中包括著名的 Chromium project (熟悉Chrome 浏览器和操作系统的,对这个名字一定不会陌生),国内不少基于 C++ 的大型项目在测试中也会经常使用它。

Google Test 跨平台的好处不用多说,单是简单易用,就能极大提高编写测试案例的效率。与此相关,Google的工程师们还提供了另外一个开源项目 Google C++ Mocking Framework (简称 Google Mock), 它也是基于 Google Test的。

如果我们当前的工程已经使用 Intel C++ 编译器作为缺省的编译器,此时加入基于 Google Mock 或者 Goolge Test 编写的测试代码时,可能会发现如下的编译错误信息:

 

/usr/local/include/gmock/internal/gmock-generated-internal-utils.h(70): error: name followed by "::" must be a class or namespace name
struct MatcherTuple< ::std::tr1::tuple > {
^
/usr/local/include/gmock/internal/gmock-generated-internal-utils.h(70): error: expected an identifier
struct MatcherTuple< ::std::tr1::tuple > {
^
/usr/local/include/gmock/internal/gmock-generated-internal-utils.h(70): error: expected an identifier
struct MatcherTuple< ::std::tr1::tuple > {
^

compilation aborted for UnitTest/xxxTestSuite.cpp (code 4)





这类错误产生的原因,其实在于上诉 Google Mock 自身的代码需要编译器能够提供对 C++ Technical Report 1 (简称 TR 1) 标准扩展 的支持。注意,TR1 只是 C++ Library Extensions。

而 Intel C++ 编译器从 2011 年 8 月发布的版本 C++ Composer XE 2011 update 6 (也就是常说的 12.1 版本) 起,开始正式对 TR1的支持,特别是支持编译 gcc 或者 MSVC 提供的有关 TR1 的头文件。 当然在编译的时候,还请务必要添加选项 –std=C++0x 来激活 Intel 编译器对标准扩展的支持。

所以简单地说,如果发现错误消息中包含类似 ::std::tr1 这类的,估计多半是还在使用比较早期的版本,例如 11.x,10.x 等等。 请尽早升级到最新的编译器版本,同时使用 –std=c++0x 吧。


附录:
1) Google C++ Testing Framework: http://code.google.com/p/googletest/
2)Google C++ Mocking Framework: http://code.google.com/p/googlemock/
3)C++ Technical Report 1 (TR1): http://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1
C++ Technical Report 1 (TR1) is the common name for ISO/IEC TR 19768, C++ Library Extensions, which was a document proposing additions to the C++ standard library for the C++03 language standard. The additions include regular expressions, smart pointers, hash tables, and random number generators.
4) Intel Developer Zone Knowledge Base (KB): https://software.intel.com/zh-cn/articles/some-gcc-headers-will-not-compile-due-to-use-of-c0x-variadic-templates

For more complete information about compiler optimizations, see our Optimization Notice.