gtest,undefined reference to 'testing::Test::~Test()',testing::Test::Test()。 (注:这是一个提问标题,无需回答,下同)

6
我使用apt-get install libgtest-dev安装了gtest,现在我想检查它是否正常工作。我在Eclipse中编写了一段简单的测试代码,但是出现了错误:

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

如果我将ATest类的继承改为protected,则该错误消失,但出现了其他错误:

testing::Test is inaccessible base of '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();
}
2个回答

12

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


这解决了我的问题。 - Scott S
2
在我的情况下,我忘记添加 target_link_libraries(NodeTest ${GTEST_BOTH_LIBRARIES}) - Denys Vitali
1
如果你错过了这个:重要的是,在你的目标文件名之后加上-lgtest。 - Bruno Rijsman

4
安装libgtest-dev并不会安装任何gtest二进制文件。它只是在您的系统上安装了googletest源代码包——头文件在/usr/include/gtest下,源文件在/usr/src/gtest下,如果需要,您可以使用cmake或GNU autotools进行构建。
在Ubuntu/Debian软件渠道(或其他我知道的地方)中没有googletest的二进制软件包。通常的做法是下载源代码包,解压缩并使用自己构建的二进制文件。源代码包中的README指导如何构建和使用库。
像您所做的那样,在系统上安装源代码包通常是没有意义的。
您遇到的链接错误:
undefined reference to 'testing::Test::~Test()

这与您的代码无关:发生这种情况是因为您没有链接libgtest,而且您无法链接它,因为它没有通过libgtest-dev安装,也没有自己构建它。
当您以一种引入编译错误的方式更改代码时,此链接错误会消失,因为如果编译失败,则不会发生链接。

谢谢,你是正确的,但在构建gtest源代码之后(我遵循了这个链接),仍然出现另一个错误:“make: *** [test] error 1”(test是项目名称),当然我已经添加了-lgtest标志。 - SangminKim
抱歉,我添加了-lpthread后它才能工作,原本需要-gtest的是-pthread吗? - SangminKim
当您构建gtest时,可以在没有pthread支持的情况下进行配置:./configure --with-pthreads=no。或者,您可以在制作时传递预处理器标志“-DGTEST_HAS_PTHREAD=0”:CPPFLAGS=-DGTEST_HAS_PTHREAD=0 make。然后,如果您的单元测试不需要它,则无需链接pthread库。 - Mike Kinghan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接