【发布时间】:2012-01-20 10:03:15
【问题描述】:
我最近被推荐使用 CMake 来编译我的 C++ 项目,现在想开始为我的代码编写一些单元测试。我已决定使用 Google 测试实用程序来帮助解决此问题,但需要一些帮助才能开始。
我整天都在阅读各种指南和示例,包括 Primer、introduction at IBM 和一些关于 SO(here 和 here)的问题以及我忘记的其他来源。我意识到那里有很多,但不知何故我仍然遇到困难。
我目前正在尝试实施最基本的测试,以确认我已正确编译/安装 gtest 并且它无法正常工作。唯一的源文件(testgtest.cpp)几乎完全取自this之前的答案:
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
和我关联的CMakeLists.txt如下:
cmake_minimum_required(VERSION 2.6)
project(basic_test)
# Setup testing
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIR})
# Add test cpp file
add_executable(runUnitTests
testgtest.cpp
)
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})
add_test(
NAME runUnitTests
COMMAND runUnitTests
)
请注意,我选择链接 gtest_main 而不是在 cpp 文件末尾提供 main,因为我相信这将使我能够更轻松地将测试扩展到多个文件。
在构建生成的 .sln 文件时(在 Visual C++ 2010 Express 中),不幸的是,我得到了一长串表单错误
2>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: virtual __thiscall std::basic_iostream<char,struct std::char_traits<char> >::~basic_iostream<char,struct std::char_traits<char> >(void)" (??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ) already defined in gtestd.lib(gtest-all.obj)
我认为这意味着我没有成功链接到 gtest 库。我确保在链接调试库时,我尝试在调试模式下构建。
编辑
在进行了更多挖掘之后,我认为我的问题与我正在构建 gtest 的库类型有关。使用 CMake 构建 gtest 时,如果未选中 BUILD_SHARED_LIBS,并且我将我的程序与这些 .lib 文件链接起来,则会出现上述错误。但是,如果选中BUILD_SHARED_LIBS,那么我会生成一组 .lib 和 .dll 文件。现在链接这些 .lib 文件时,程序会编译,但运行时会抱怨找不到 gtest.dll。
SHARED 和非SHARED 库之间有什么区别,如果我选择不共享,为什么它不起作用?我的项目的 CMakeLists.txt 中是否有我缺少的选项?
【问题讨论】:
-
您可以通过使用
ExternalProject_Add而不是add_subdirectory来避免在自己的文件中包含GTest 源。详情请见this answer。 -
为什么我们可以在上面的解决方案示例中访问 ${gtest_SOURCE_DIR}?该变量是如何/在哪里声明的?
-
哦,它是在 gtest-1.6.0/CMakeLists.txt 中声明的:"project(gtest CXX C)" 这使得变量 gtest_SOURCE_DIR 和 gtest_BINARY_DIR 可用。
-
enable_testing()是做什么的? -
@updogliu:它启用 ctest 和“测试”(或“RUN_TESTS”)目标。它与 add_test() cmake 命令一起使用。
标签: unit-testing cmake googletest