gtest - 使用TEST_F时未定义的符号

时间:2017-07-03 02:43:19

标签: c++ debugging testing linker googletest

我不确定我是否正确设置了我的gtest环境。当我使用TEST内容EXPECT_EQ时,这一切都很好。但是,当我尝试像TEST_F这样的更好的东西时,链接器会抱怨。

源代码:

class MyTest : public testing::Test
{
protected:
    static const int my_int = 42;
};

TEST_F(MyTest, test)
{
    EXPECT_EQ(my_int, 42);
}

这就是

Undefined symbols for architecture x86_64:
  "MyTest::my_int", referenced from:
      MyTest_test_Test::TestBody() in instruction_test.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [tests/tests/run_tests] Error 1
make[2]: *** [tests/tests/CMakeFiles/run_tests.dir/all] Error 2
make[1]: *** [tests/tests/CMakeFiles/run_tests.dir/rule] Error 2
make: *** [run_tests] Error 2

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

我设法解决了这个问题,但我不知道它为什么会这样:

所以在我使用static const int my_int之前,我必须在MyTest类之外再次声明它:

class MyTest : public testing::Test
{
protected:
    static const int my_int = 42;
};

const int MyTest::my_int;    

TEST_F(MyTest, test)
{
    EXPECT_EQ(my_int, 42);
}

答案 1 :(得分:1)

这不是googletest的问题,而是来自C ++的语义。

原因: 我们只能在类上调用静态类成员,而不能在类的对象上调用。即使没有实例,这也是可能的。这就是为什么每个静态成员实例必须初始化的原因,通常是在cpp文件中。