我最近一直在使用 CMake 编译我的 C + + 项目,现在想开始为我的代码编写一些单元测试。我已经决定使用谷歌测试工具来帮助这一点,但需要一些帮助才能开始。
一整天我都在阅读各种指南和例子,包括 雷管,在 IBM 的介绍和一些关于 SO (给你和 给你)的问题,以及其他我已经忘记的来源。我意识到外面的世界还有很多,但不知为什么我仍然有困难。
我目前正在尝试实现最基本的测试,以确认我已经编译/安装了正确的 gtest,它不工作。唯一的源文件(testgtest.cpp)几乎完全取自 这个之前的答案:
#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 中是否有我缺少的用于项目的选项?