2017-07-03 39 views
0

當我不知道如果我安裝我的GTEST環境中正常。當我做普通TESTEXPECT_EQ的東西,這一切都很好。然而,當我嘗試像TEST_F這樣的鴿友時,鏈接器會抱怨。GTEST - 未定義符號使用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 

任何想法,爲什麼出現這種情況?

回答

1

這不是來自googletest的問題,它是來自C++的語義。

原因: 我們只能呼籲類,而不是一個類的對象靜態類成員。這是可能的,即使沒有實例存在。這就是每個靜態成員實例必須初始化的原因,通常在cpp文件中。

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); 
} 
+0

這是C++,它沒有任何與谷歌測試。類聲明中的任何靜態類成員都必須實例化(定義)。 – glagolig