【问题标题】:C++ : Unit testing using Google Mock with Code::Blocks, MinGW and C++11C++:使用带有 Code::Blocks、MinGW 和 C++11 的 Google Mock 进行单元测试
【发布时间】:2014-11-11 19:58:19
【问题描述】:

我一直在尝试按照一本书自学单元测试。

书中代码使用C++11标准,有这样一行:

auto variable = function(parameter);

当我第一次编译它时,我收到了这个警告:

警告:'auto' 在 C++11 中改变了含义;请删除它[-Wc++0x-compat]

没什么大不了的,我可以通过选中 Project->Build options... 菜单中的以下框来解决这个问题:

[ ] 让 g++ 遵循 C++ 11 ISO C++ 语言标准 [-std=c++11]

但是,现在我在 gtest-port.h 中收到与 Google Mock 相关的新错误:

| |在函数'int testing::internal::posix::StrCaseCmp(const char*, const char*)'中:

|1719|错误:“_stricmp”未在此范围内声明

| |在函数'char* testing::internal::posix::StrDup(const char*)'中:

|1721|错误:“_strdup”未在此范围内声明

| |在函数 'FILE* testing::internal::posix::FDOpen(int, const char*)':|

|1779|错误:“fdopen”未在此范围内声明

搜索这个问题对我来说收效甚微,但我确实尝试定义了目标操作系统,因为它是一个建议的解决方案,以防它没有被自动正确识别。在项目中添加 GTEST_OS_WINDOWS=1 和/或 GTEST_OS_WINDOWS_DESKTOP=1 定义没有任何改变。

我意识到这在这种情况下很容易解决,只需提供正确的类型而不是使用 auto,但如果可能的话,我想找到一个解决方案。替换 auto 并且未选中 -std=c++11 选项会使代码按预期工作,因此库可以正常工作。

我在 Windows 中使用 Code::Blocks 13.12、MinGW/g++ 4.8.1-4 和 Google Mock 1.7。

感谢阅读 =)

【问题讨论】:

  • 谢谢 sjdowling,这确实有效!不过,似乎无法弄清楚如何将您的出色答案标记为问题的答案。我会努力弄清楚的。

标签: c++ c++11 mingw codeblocks gmock


【解决方案1】:

这里的答案在于缺少声明的函数:_stricmp_strdupfdopen。前两个是 POSIX 函数 stricmpstrdup 的 Microsoft 版本。请注意,您指定使用不包含 POSIX 标准中的项目的 C++11 ISO 标准。通过指定 --std=gnu++11,您是在告诉编译器接受 C++11 和 POSIX 的混合以及 GNU 扩展。

有趣的是,我无法在 Linux 上使用 GCC 4.8.2 复制它,因此在 Windows 上编译时,Google Mock 标头中可能会发生其他事情。

【讨论】:

    【解决方案2】:

    为仍然面临相同问题的任何人回答: 此问题的根源可能在您的 CMakeLists 文件中。 将编译器标志设置为 -std=gnu++ 而不是 -std=c++ 一种方法是包含

    set(CMAKE_CXX_FLAGS "-std=gnu++0x") 
    

    到您的 CMakeLists 文件。

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多