c++ - 将测试从 GoogleTest 升级到 GoogleMock (Ubuntu 14) 时出现与 pthread 相关的错误

标签 c++ qt pthreads googletest googlemock

尝试添加 gmock 时到已经在使用 gtest 的现有项目, 我发现了一系列与 pthread 有关的低级错误.我的猜测是这与 GoogleMock 和 GoogleTest 的构建方式有关(请参阅下面的详细信息),但不幸的是,关于在 Ubuntu 14 中使用这些库的最佳方式的信息不多。

将代码缩减为最小的代表性示例后,会发生什么:

  1. 我将 GoogleTest header 替换为 GoogleMock header 以及“主要”函数:

    // Declarations at foo.h
    class Foo {
    public:
     int sum(int a, int b); // it returns a+b (defined in foo.cpp)
    };
    
    // Test code at foo.test.cpp
    #include <gmock/gmock.h> // replaced <gtest/gtest.h>
    #include "foo.h"
    TEST(Foo,ReturnsSumOfTwoNumbers){
     Foo foo;
     ASSERT_EQ( foo.sum(2,8), 10 );
    }
    TEST(Foo,ReturnsSumOfTwoIntegerNumbers){
     Foo foo;
     ASSERT_EQ( 6,foo.sum(-2,8) );
    }
    
    // main.cpp
    #include <gmock/gmock.h> // replaced <gtest/gtest.h>
    
    int main(int argc, char **argv) {
     ::testing::InitGoogleMock(&argc, argv); // replaced InitGoogleTest
     return RUN_ALL_TESTS();
    }
    

这很好用。

  1. 当我尝试使用 GoogleMock 功能(例如匹配器)时:

    // foo.test.cpp
    using ::testing::Eq;
    //...
    TEST(Foo,ReturnsSumOfTwoNumbers){
     Foo foo;
     // replaced ASSERT_EQ
     ASSERT_THAT( foo.sum(2,8), Eq(10) );
    }
    

.. 它因以下错误而崩溃:

[ FATAL ] /path/to/gmock-1.7.0/gtest/include/gtest/internal/gtest-port.h:1340:: pthread_mutex_lock(&mutex_)failed with error 22 Aborted (core dumped)

使用其他 gmock 功能产生了类似的错误。

构建信息:

  • Ubuntu 14.04
  • 海湾合作委员会 4.8.2
  • gmock 1.7.0 已下载并使用 CMAKE 构建:

    wget https://googlemock.googlecode.com/files/gmock-1.7.0.zip
    unzip gmock-1.7.0.zip
    GMOCK_PATH=$PWD/gmock-1.7.0
    GTEST_PATH=$GMOCK_PATH/gtest
    mkdir $GMOCK_PATH/lib $GTEST_PATH/lib
    pushd $GMOCK_PATH/lib
    cmake -DBUILD_SHARED_LIBS=ON ..
    make
    cd $GTEST_PATH/lib
    cmake -DBUILD_SHARED_LIBS=ON ..
    make
    popd 
    
  • 最后,整个项目使用Qt的qmake构建:

    INCLUDEPATH += $${GMOCK_PATH}/include $${GTEST_PATH}/include
    LIBS += -L$${GTEST_PATH}/lib -L$${GMOCK_PATH}/lib -lgmock -lgtest -lpthread
    

编译器输出为:

g++ -m64 -Wl,-rpath,/path/to/gmock-1.7.0/gtest/lib -Wl,-rpath,/path/to/gmock-1.7.0/lib -o all_tests foo.test.o foo.o main.o -L/path/to/gmock-1.7.0/gtest/lib -L/path/to/gmock-1.7.0/lib -lgmock -lgtest -lpthread

最佳答案

尝试在 CMake 中使用它

add_definitions("-DGTEST_HAS_PTHREAD=0")

关于c++ - 将测试从 GoogleTest 升级到 GoogleMock (Ubuntu 14) 时出现与 pthread 相关的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30865653/

相关文章:

c++ - 在大括号初始化结束时与额外的 ","有什么关系吗?

c++ - 无法检索刚刚创建的窗口的标题

linux - 使用 qt 最小化应用程序

c++ - 为什么删除的复制构造函数不允许使用其他具有多态类型的构造函数?

c++ - UE4项目链接错误,描述为空

c++ - 从其他线程使用qglcontext

c++ - 如何在 QString 中使用语言(如阿拉伯语或中文)?

Java 在 C 中的 volatile ?

c - 将线程绑定(bind)到处理器

c++ - 如何终止线程池中的所有预分配线程?