2017-07-03 6 views
0

を使用するときに未定義のシンボル私は確かに私のセットアップ私のGTEST環境であれば、正しくないです。 EXPECT_EQと普通のTESTの場合は、すべてうまくいきます。しかし、私が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ファイルで初期化する必要があります。 C++で

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

、それは、Googleのテストとは何の関係もありません。クラス宣言からのすべての静的クラスメンバーをインスタンス化(定義)する必要があります。 – glagolig

関連する問題