2017-06-24 22 views
1

CMakegtestの最小限の例を作成しようとしていますが、テストをどのようにリンクする必要があるかわかりません。gtestとCMakeをリンクするには?

私はgtestのREADMEを読んでいます。しかし、CMakeLists.txt.inを作成する代わりに、を使用するプロジェクトに手動でgtestを追加する方法を学びたいと思います。私は私のテストはgtest

エラーメッセージ

Scanning dependencies of target tests 
[ 25%] Building CXX object CMakeFiles/tests.dir/tests/main_test.cc.o 
/Users/kkweon/temp/gtest_tutorial/tests/main_test.cc:5:1: warning: treating Unicode character as whitespace [-Wunicode-whitespace] 
  ::testing::InitGoogleTest(&argc, argv); 
^ 
/Users/kkweon/temp/gtest_tutorial/tests/main_test.cc:5:3: warning: treating Unicode character as whitespace [-Wunicode-whitespace] 
  ::testing::InitGoogleTest(&argc, argv); 
^ 
/Users/kkweon/temp/gtest_tutorial/tests/main_test.cc:6:1: warning: treating Unicode character as whitespace [-Wunicode-whitespace] 
  return RUN_ALL_TESTS(); 
^ 
/Users/kkweon/temp/gtest_tutorial/tests/main_test.cc:6:3: warning: treating Unicode character as whitespace [-Wunicode-whitespace] 
  return RUN_ALL_TESTS(); 
^ 
4 warnings generated. 
[ 50%] Building CXX object CMakeFiles/tests.dir/tests/add_test.cc.o 
[ 75%] Building CXX object CMakeFiles/tests.dir/src/add.cc.o 
[100%] Linking CXX executable tests 
Undefined symbols for architecture x86_64: 
    "testing::InitGoogleTest(int*, char**)", referenced from: 
     _main in main_test.cc.o 
    "testing::Test::SetUp()", referenced from: 
     vtable for AddTest_AddIntegers_Test in add_test.cc.o 
    "testing::Test::TearDown()", referenced from: 
     vtable for AddTest_AddIntegers_Test in add_test.cc.o 
    "testing::Test::Test()", referenced from: 
     AddTest_AddIntegers_Test::AddTest_AddIntegers_Test() in add_test.cc.o 
    "testing::Test::~Test()", referenced from: 
     AddTest_AddIntegers_Test::~AddTest_AddIntegers_Test() in add_test.cc.o 
    "testing::Message::Message()", referenced from: 
     AddTest_AddIntegers_Test::TestBody() in add_test.cc.o 
    "testing::UnitTest::GetInstance()", referenced from: 
     RUN_ALL_TESTS() in main_test.cc.o 
    "testing::UnitTest::Run()", referenced from: 
     RUN_ALL_TESTS() in main_test.cc.o 
    "testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*)", referenced from: 
     AddTest_AddIntegers_Test::TestBody() in add_test.cc.o 
    "testing::internal::AssertHelper::~AssertHelper()", referenced from: 
     AddTest_AddIntegers_Test::TestBody() in add_test.cc.o 
    "testing::internal::GetTestTypeId()", referenced from: 
     ___cxx_global_var_init in add_test.cc.o 
    "testing::internal::MakeAndRegisterTestInfo(char const*, char const*, char const*, char const*, testing::internal::CodeLocation, void const*, void (*)(), void (*)(), testing::internal::TestFactoryBase*)", referenced from: 
     ___cxx_global_var_init in add_test.cc.o 
    "testing::internal::GetBoolAssertionFailureMessage(testing::AssertionResult const&, char const*, char const*, char const*)", referenced from: 
     AddTest_AddIntegers_Test::TestBody() in add_test.cc.o 
    "testing::internal::IsTrue(bool)", referenced from: 
     testing::internal::scoped_ptr<std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::reset(std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >*) in add_test.cc.o 
     testing::internal::scoped_ptr<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::reset(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*) in add_test.cc.o 
    "testing::internal::AssertHelper::operator=(testing::Message const&) const", referenced from: 
     AddTest_AddIntegers_Test::TestBody() in add_test.cc.o 
    "typeinfo for testing::Test", referenced from: 
     typeinfo for AddTest_AddIntegers_Test in add_test.cc.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] Error 1 
make[2]: *** [CMakeFiles/tests.dir/all] Error 2 
make[1]: *** [CMakeFiles/tests.dir/rule] Error 2 
make: *** [tests] Error 2 

情報

をリンクすることはできませんようだ make tests
  • で私のテストファイルをコンパイルすることはできません

    問題

    • . 
      ├── CMakeLists.txt 
      ├── src 
      │   ├── add.cc 
      │   ├── add.h 
      │   └── main.cc 
      └── tests 
          ├── add_test.cc 
          └── main_test.cc 
      

      とCMakeLists.txtは

      cmake_minimum_required(VERSION 3.0) 
      
      set(EXTRA_BINCFLAGS "-Wall -Wextra") 
      set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${EXTRA_BINCFLAGS}) 
      
      include_directories(/Users/kkweon/github/googletest/googletest/include) 
      include_directories(src) 
      
      set(SOURCES src/add.cc) 
      set(TEST_SOURCES tests/main_test.cc tests/add_test.cc) 
      
      add_executable(main src/main.cc ${SOURCES}) 
      add_executable(tests ${TEST_SOURCES} ${SOURCES}) 
      

      ファイル:

      私はgoogletest repository

      /Users/kkweon/github/googletest/googletest/include/gtest/gtest.hに位置する "gtest.h" /Users/kkweon/github/googletestに私のプロジェクト構造がダウンロードされていますソースコード全体:github

      ありがとうございます!

  • 答えて

    2

    googletestでちょうどinclude_directoriesには不十分です。コンパイルするソースも追加する必要があります。

    これはwhat we doです:

    私たちは別々のCMakeのターゲットを作成google-testライブラリとしてコンパイル。私たちのソースツリーにはgoogletestフォルダが含まれているので、プロジェクトとGoogle Testは一緒になっています。あなたの主なCMakeLists

    あなたはadd_subdirectory(googletest)

    googletestフォルダは、独自のCMakeLists.txtファイルとinclude/src/フォルダ(フルgoogletestレポを保存する必要はありません!)を持っています。その後

    set(google_test_include_dirs 
        "${CMAKE_CURRENT_SOURCE_DIR}" 
        "${CMAKE_CURRENT_SOURCE_DIR}/include") 
    include_directories(${google_test_include_dirs}) 
    file(GLOB_RECURSE google_test_headers ${CMAKE_CURRENT_SOURCE_DIR}/*.h) 
    set(google_test_sources src/gtest-all.cc src/gtest_main.cc) 
    add_library(google-test STATIC ${google_test_sources} ${google_test_headers}) 
    

    テストであなたの目標のためにあなたが何かの操作を行います:

    add_executable(MyTests ${my_unittests_sources}) 
    include_directories("${CMAKE_CURRENT_SOURCE_DIR}") 
    include_directories("${CMAKE_SOURCE_DIR}/googletest/include") 
    
    target_link_libraries(MyTests google-test) 
    

    私がリンクされているプロジェクトでCMakeLists.txtgoogletest/CMakeLists.txtunittests/CMakeLists.txtを参照してくださいをごgoogletest/CMakeLists.txtあなたが行うには

    tree googletest/ 
    
    googletest/ 
    ├── CMakeLists.txt 
    ├── include 
    │   └── gtest 
    │    ├── gtest-death-test.h 
         ... 
    └── src 
        ├── gtest-all.cc 
        ├── gtest.cc 
        └── gtest_main.cc 
        ... 
    

    上記。

    +0

    ありがとうございました! GitHubのリンクは私を助けてくれました。 –

    関連する問題