web-dev-qa-db-ja.com

Gtest:未定義の参照

GoogleTestを使用して簡単な関数をテストしようとしていますが、ビルドフォルダーでmakeを実行すると、コンパイラーがUndefined Referenceエラーメッセージをスローします。 gtestヘッダーファイルを参照したので、何が問題なのかわかりません。何か案は?私はunixとユニットテストの両方の主題全体に慣れていないので、単純なものを見逃している可能性があります。前もって感謝します!

エラーメッセージ:

CMakeFiles/Proj2.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x1e): undefined reference to `testing::InitGoogleTest(int*, char**)'
main.cpp:(.text+0x23): undefined reference to `testing::UnitTest::GetInstance()'
main.cpp:(.text+0x2b): undefined reference to `testing::UnitTest::Run()'
collect2: error: ld returned 1 exit status

main.cpp

#include "gtest/gtest.h"

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

Test.cpp

#include "gtest/gtest.h"
#include "Testable.h"

TEST(GetTwoTest, Two) {
    EXPECT_EQ(2, GetTwo());
}

Testable.cpp

#include "Testable.h"

int GetTwo() {
    return 3;
}

ここに私のCMakeLists.txtファイルがあります:

cmake_minimum_required(VERSION 2.6)

SET(CMAKE_CXX_FLAGS "-std=gnu++11") #Turn on C++11 Support

set(FILES_TO_TEST Testable.cpp)
set(UNIT_TESTS Test.cpp)
set(MAIN_FILE main.cpp)

add_subdirectory(gtest) #Build all the gtest stuff
include_directories(gtest/include)
include_directories(.)
add_library(codeToTest ${FILES_TO_TEST})

add_executable(Proj2 ${MAIN_FILE})
target_link_libraries(Proj2 codeToTest)

add_executable(unit-test ${UNIT_TESTS})
target_link_libraries(unit-test gtest gtest_main rt pthread codeToTest)
19
Vance

設定はほぼ正しいようです。ただし、2つの個別のmain関数が必要です。 1つは実際の実行可能ファイルProj2用で、もう1つはgtestが含まれ、テスト実行可能ファイルunit-test用の関数が含まれています。

これを行うには、main.cppとtest_main.cppの2つの異なるmain.cppファイルを使用します。表示したのはtest_main.cppで、add_executable(unit-test ...コマンドに含まれています。

新しいmain.cppには、インクルードまたは関数のいずれのgtestへの参照もありません。

11
Fraser

リンカエラーから、gtestライブラリをテストプログラムにリンクしなかったことは明らかです。

Primer を参照してください:

Google Testを使用してテストプログラムを作成するには、Google Testをライブラリにコンパイルして、テストとリンクする必要があります。 ...

コンパイラとシステムの詳細については、このドキュメントをご覧ください。

4
PiotrNycz