如何开始使用GTest和CMake

我最近在使用CMake编译我的C ++项目时卖了,现在想开始为我的代码编写一些单元测试。 我决定使用Google测试实用程序来解决这个问题,但需要一些帮助才能入门。

我一整天都在阅读各种指南和例子,其中包括Primer,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库。 我已经确定,当与调试库链接时,我已经尝试在调试模式下构建。

编辑

在做了更多的挖掘之后,我认为我的问题与我正在构建的图书馆类型有关。 当使用CMake构建gtest时,如果BUILD_SHARED_LIBS未被选中,并且将我的程序与这些.lib文件链接,我会得到上面提到的错误。 但是,如果选中BUILD_SHARED_LIBS ,则会生成一组.lib和.dll文件。 当现在链接到这些.lib文件时,程序会编译,但是当运行时抱怨它找不到gtest.dll。

SHAREDSHARED库之间有什么区别,如果我选择不共享,为什么它不起作用? CMakeLists.txt中是否有我缺少的项目选项?


解决方案涉及将gtest源目录作为项目的子目录。 如果对任何人都有帮助,我已经在下面列出了CMakeLists.txt。

cmake_minimum_required(VERSION 2.6)
project(basic_test)

################################
# GTest
################################
ADD_SUBDIRECTORY (gtest-1.6.0)
enable_testing()
include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})

################################
# Unit Tests
################################
# Add test cpp file
add_executable( runUnitTests testgtest.cpp )
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests gtest gtest_main)
add_test( runUnitTests runUnitTests )

这是我刚刚测试的一个完整的工作示例。 它直接从网上下载,或者是一个固定的tarball,或者是最新的subversion目录。

cmake_minimum_required (VERSION 3.1)

project (registerer)

##################################
# Download and install GoogleTest

include(ExternalProject)
ExternalProject_Add(gtest
  URL https://googletest.googlecode.com/files/gtest-1.7.0.zip
  # Comment above line, and uncomment line below to use subversion.
  # SVN_REPOSITORY http://googletest.googlecode.com/svn/trunk/ 
  # Uncomment line below to freeze a revision (here the one for 1.7.0)
  # SVN_REVISION -r700

  PREFIX ${CMAKE_CURRENT_BINARY_DIR}/gtest
  INSTALL_COMMAND ""
)
ExternalProject_Get_Property(gtest source_dir binary_dir)

################
# Define a test
add_executable(registerer_test registerer_test.cc)

######################################
# Configure the test to use GoogleTest
#
# If used often, could be made a macro.

add_dependencies(registerer_test gtest)
include_directories(${source_dir}/include)
target_link_libraries(registerer_test ${binary_dir}/libgtest.a)
target_link_libraries(registerer_test ${binary_dir}/libgtest_main.a)

##################################
# Just make the test runnable with
#   $ make test

enable_testing()
add_test(NAME    registerer_test 
         COMMAND registerer_test)

很可能,测试二进制文件和Google测试库之间编译器选项的差异是导致这种错误的原因。 这就是为什么建议在源代码表单中引入Google Test并将其与测试一起构建的原因。 在CMake中很容易做到。 您只需使用gtest根目录的路径调用ADD_SUBDIRECTORY ,然后就可以使用在gtest_main定义的公共库目标( gtestgtest_main )。 在googletestframework组中,这个CMake线程中有更多的背景信息。

BUILD_SHARED_LIBS选项现在仅在Windows上有效。 它指定了您希望CMake构建的库的类型。 如果将它设置为ON ,CMake会将它们构建为DLL而不是静态库。 在这种情况下,您必须使用-DGTEST_LINKED_AS_SHARED_LIBRARY = 1构建您的测试,并使用您的测试二进制文件将CMake生成的DLL文件复制到目录中(默认情况下,CMake将它们放置在单独的输出目录中)。 除非静态库中的gtest不适用于您,否则更容易不设置该选项。

链接地址: http://www.djcxy.com/p/24457.html

上一篇: How to start working with GTest and CMake

下一篇: Compiling with cmake and include debug information