【问题标题】:GMock doesn't compile - GTEST_EXCLUSIVE_LOCK_REQUIRED seems to not be definedGMock 无法编译 - GTEST_EXCLUSIVE_LOCK_REQUIRED 似乎没有被定义
【发布时间】:2014-02-27 10:04:08
【问题描述】:

我正在尝试构建一个简单的模拟类

#include "interpolation.hpp"

#include <gtest/gtest.h>
#include <gmock/gmock.h>

class MockInterp1D : public Interp1DBase {
public:
    MOCK_METHOD1(evaluateAt, double(double));
    MOCK_METHOD2(evaluateAt, double(double, int));
};

基于以下基类

class Interp1DBase {
public:
    virtual double evaluateAt(double) const = 0;
    virtual double evaluateAt(double, int) const = 0;
    virtual ~Interp1DBase() { };
};

使用 Google Mocks。当我尝试编译使用此模拟的测试时,我收到以下错误:

In file included from /usr/include/gmock/gmock-generated-function-mockers.h:43:0,
                 from /usr/include/gmock/gmock.h:61,
                 from /home/tlycken/exjobb/Code/alpha-orbit-follower/test/interpolation/interpolation-mocks.hpp:4,
                 from /home/tlycken/exjobb/Code/alpha-orbit-follower/test/physics/B-field-tests.hpp:6,
                 from /home/tlycken/exjobb/Code/alpha-orbit-follower/test/physics/B-field-tests.cpp:2:
/usr/include/gmock/gmock-spec-builders.h:134:41: error: expected ‘;’ at end of member declaration
   bool VerifyAndClearExpectationsLocked()
                                         ^

然后字面上数百个类似的语法或定义错误都指向 GMock 中的文件。

我查看了gmock-spec-builder.h:134,发现以下内容(在某些情况下):

// Verifies that all expectations on this mock function have been
// satisfied.  Reports one or more Google Test non-fatal failures
// and returns false if not.
bool VerifyAndClearExpectationsLocked()
    GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);

这让我相信GTEST_EXCLUSIVE_LOCK_REQUIRED_ 可能是一个由于某种原因没有定义的宏。事实上,在挖掘了 gmock/gmock.hgtest/gtest.h 中包含的所有头文件之后,我仍然没有找到该宏的定义。

我在这里做错了什么?


更新:

我已经能够生成一个更简单的最小示例:

// in file mock-test.cpp
#include <gmock/gmock.h>
// Yeah, that's the only content

编译

g++ -o mock-test.o -c mock-test.cpp

导致同样的错误。

我通过sudo apt-get install google-mock 安装了GMock,它在/usr/src 下给了我一个文件夹,我可以在其中运行cmake .,然后运行make 来生成我复制到/usr/lib 的库文件。头文件已经在/usr/include,所以我没有手动对它们做任何事情。

【问题讨论】:

    标签: c++ cmake googletest googlemock


    【解决方案1】:

    当我尝试使用 gmock 1.7 和 gtest 1.6 进行编译时,我遇到了同样的错误。确保您使用的是相同版本的 gtest。

    【讨论】:

    • 原来是这个问题——我之前用过gtest,然后我用sudo apt-get install gtest安装它,显然是引入了1.6版。当我将 gmock 添加到项目中时,它在包 repo 中不可用,所以我抓住了源代码,版本 1.7 - 它捆绑了 gtest 1.7。但是,由于我的搜索路径中仍然有较旧的 gtest 标头和库(在 /usr/include/usr/lib 下的某个位置)gcc 似乎更喜欢从那里抓取它们,从而导致此错误。
    【解决方案2】:

    我不知道如何在gcc 中使用 g-mock。 但基本上我们在这样的窗口中使用。 你的类定义是正确的。 你用过那些功能吗

    EXPECT_CALL(classobj, exact functionname as it looks in definition).AtLeast(Times(0)).Return(0);

    然后

    classobj.exact functionname as it looks in definition()

    试试这个我认为它应该工作。如果您想详细了解,请告诉我,我将通过一些典型示例进行扩展。

    【讨论】:

    • 感谢您的回答!但是,在我尝试模拟任何东西之前这会失败 - 请参阅更新以获取仍然重现问题的更简单示例。
    • @Tomas Lycken:写正文,为什么只写#include &lt;gmock/gmock.h&gt;
    • @TomasLycken:你配置gmock properly了吗?我的意思是libs 等等。您需要为您的项目提供 gmock 和 gtest libs
    • 我没有写更多的东西只是为了产生尽可能短的东西来重现错误。如果我写了一个类体是无关紧要的 - 编译器甚至没有到达那里,因为它在 gmock.h 上窒息。我尝试使用所有标志进行编译以包含 gmocks 和 gtest 库,但这并没有什么不同。
    【解决方案3】:

    /usr/src/gmock 文件夹中有相应的源代码和头文件。

    您的工作只是覆盖文件夹的全部内容:

    /usr/src/gmock/gtest/src -> /usr/src/gtest/src /usr/src/gmock/gtest/cmake -> /usr/src/gtest/cmake /usr/src/gmock/gtest/CMakeLists.txt-> /usr/src/gtest/CMakeLists.txt /usr/src/gmock/gtest/include/gtest -> /usr/include/gtest/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-18
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2012-11-15
      • 2012-04-18
      相关资源
      最近更新 更多