作者:kanlikanliti_627 | 来源:互联网 | 2023-01-31 13:19
我正在尝试创建gtest
with 的最小示例CMake
,但不确定如何链接测试。
我已经阅读了gtest 的自述文件。但是,除了创建之外CMakeLists.txt.in
,我想学习如何将手动添加gtest
到使用的项目中CMake
。
问题
我无法通过以下方式编译测试文件 make tests
看来我的测试无法连结 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::allocator > >::reset(std::__1::basic_stringstream, std::__1::allocator >*) in add_test.cc.o
testing::internal::scoped_ptr, std::__1::allocator > >::reset(std::__1::basic_string, std::__1::allocator >*) 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
信息
我已将googletest存储库下载到/Users/kkweon/github/googletest
而“ gtest.h”位于 /Users/kkweon/github/googletest/googletest/include/gtest/gtest.h
我的项目结构:
.
??? 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})
整个源代码:github
先感谢您!
1> Stanislav Pa..:
仅include_directories
使用googletest 还是不够的。您还必须添加要编译的源。
这就是我们要做的:
我们创建一个单独的CMake目标,将其google-test
编译为库。我们googletest
在源代码树中包含文件夹,以便我们的项目和Google Test保持在一起。
在你的主CMakeLists
,你做add_subdirectory(googletest)
googletest
文件夹中都有自己的CMakeLists.txt
文件include/
和src/
文件夹(无需存储完整googletest回购!)。
tree googletest/
googletest/
??? CMakeLists.txt
??? include
? ??? gtest
? ??? gtest-death-test.h
...
??? src
??? gtest-all.cc
??? gtest.cc
??? gtest_main.cc
...
在您的工作中googletest/CMakeLists.txt
:
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.txt
,googletest/CMakeLists.txt
并且unittests/CMakeLists.txt
在上面我已链接的项目中。