【问题标题】:gtest, undefined reference to 'testing::Test::~Test()', testing::Test::Test()gtest,未定义对 'testing::Test::~Test()' 的引用,testing::Test::Test()
【发布时间】:2014-06-10 15:59:26
【问题描述】:

我使用 apt-get install libgtest-dev 安装了 gtest

我正在尝试检查它是否有效。

所以我编写了简单的代码在 Eclipse 中进行测试。

但是有错误,

对'testing::Test::~Test()'的未定义引用
未定义参考 到'testing::Test::Test()'

相反,如果我将 ATest 类的继承更改为受保护,错误就会消失,但是

另一个错误发生

testing::Test 是 'ATest_AAA_Test' 的不可访问基础

怎么了?

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

class A{
public:
    int a;
    A(int a){this->a = a;}
    A(){}
    ~A(){}
    int getA(){return a;}
    void setA(int a){this->a = a;}
};

class ATest : public ::testing::Test{
public:
    virtual void SetUp(){
        a1 = A(1);
        a2 = A(2);
        a3 = A(3);
    }
    virtual void TearDwon(){}
    A a1;
    A a2;
    A a3;
};

TEST_F(ATest, AAA){
    EXPECT_EQ(1, a1.getA());
    EXPECT_EQ(2, a2.getA());
    EXPECT_EQ(3, a3.getA());
}

int main(int argc, char **argv){
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

【问题讨论】:

    标签: c++ unit-testing googletest


    【解决方案1】:

    我知道这听起来很明显,但我的心理调试技能告诉我,当您链接最终二进制文件时,您忘记在目标文件名之后添加-lgtest。

    【讨论】:

    • 这解决了我的问题。
    • 就我而言,我忘了添加target_link_libraries(NodeTest ${GTEST_BOTH_LIBRARIES})
    • 如果你错过了:重要的是 -lgtest 出现在你的目标文件名之后
    【解决方案2】:

    安装 libgtest-dev 不会安装任何 gtest 二进制文件。 它只是在您的系统上安装 googletest 源包 - 标头 在/usr/include/gtest 和/usr/src/gtest 下的源文件, 您可以在其中使用cmake 或 GNU autotools 继续构建它 如果你愿意。

    ubuntu/debian 软件频道中没有 googletest 的二进制包 (或我知道的其他地方)。正常的做法是 download the source archive, 提取它并使用您自己构建的二进制文件。中的README 源包提供了构建和使用库的指导。

    执行系统安装通常没有任何目的 源包,就像你做的那样。

    你遇到的联动错误:

    undefined reference to 'testing::Test::~Test()
    

    与您的代码无关:它发生是因为您不是 链接libgtest,因为没有安装所以不能链接 由libgtest-dev 编写,您还没有自己构建。

    当您以某种方式更改代码时,此链接错误消失 这会引入编译错误,因为如果编译失败 那么链接就不会发生。

    【讨论】:

    • 谢谢,你是对的,但是在构建了gtest的src代码之后(我遵循了这个link),另一个错误仍然发生。 “make: *** [test] error 1”(test是项目名),当然我加了-lgtest标志。
    • 对不起,我添加了-lpthread,原来gtest需要-pthread?
    • 当您构建 gtest 时,您可以在不支持 pthread 的情况下对其进行配置:./configure --with-pthreads=no。或者,您可以在创建时传递预处理器标志“-DGTEST_HAS_PTHREAD=0”:CPPFLAGS=-DGTEST_HAS_PTHREAD=0 make。如果您的单元测试不需要它,那么您就不需要链接 pthread 库。
    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 2020-02-27
    • 1970-01-01
    • 2021-05-27
    • 2022-12-02
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多