如何在项目中构建gtest并在cmake中使用find_package(GTest)和GTEST_ADD_TESTS?

时间:2014-07-23 17:38:56

标签: cmake googletest

我想在CMake项目中使用gtest。以前,我已经构建了gtest并将头文件和库复制到可以找到它们的位置,以便克服缺少Ubuntu包来提供相同的功能。

gtest开发人员推荐的方法是build gtest inside the project that is using it

但是,我还想使用CMake GoogleTest module中定义的gtest_add_testsgtest_discover_tests函数。

find_package(GTest REQUIRED)失败了,因为图书馆还没有建成:

Could NOT find GTest (missing: GTEST_LIBRARY GTEST_MAIN_LIBRARY)

所以看起来它必须是一个两阶段的过程,并且没有办法保证遵守“一个定义规则”。我是否需要编写定义函数的自定义FindGTest.cmake,但不查找库,以便它们只有在cmake完成后才可用并构建它们?

3 个答案:

答案 0 :(得分:3)

您可以考虑使用外部项目。

http://www.kitware.com/media/html/BuildingExternalProjectsWithCMake2.8.html

您可以大致使用它(从我的代码执行相同的操作,版本可能会有所不同等):

set(GTest_version 1.6.0)
set(GTest_url "http://googletest.googlecode.com/files/gtest-${GTest_version}.zip")
set(GTest_md5 "4577b49f2973c90bf9ba69aa8166b786")
set(GTest_BUILD_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/build")
set(GTest_BUILD_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/install")
set(GTest_DOWNLOAD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Downloads")

ExternalProject_Add(GTest
  URL ${GTest_url}
  URL_MD5 ${GTest_md5}
  PREFIX  ${GTest_BUILD_PREFIX}
  DOWNLOAD_DIR ${GTest_DOWNLOAD_DIR}
  CMAKE_GENERATOR ${gen}
  CMAKE_ARGS
    -DBUILD_SHARED_LIBS:BOOL=ON
    -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
    -DCMAKE_INSTALL_PREFIX:PATH=${GTest_BUILD_INSTALL_PREFIX}
    -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
)

set(GTEST_ROOT ${GTest_BUILD_INSTALL_PREFIX} CACHE STRING "")

答案 1 :(得分:0)

另一种选择是在CMake时间为您的构建提供GoogleTest源代码,然后使用gtest将其拉入。这将确保使用与主项目相同的编译器设置构建GoogleTest。您无法使用FindGTest模块,但是您可以使用gtest_maingtest CMake目标,而这些目标非常方便。例如,它们带有依赖项信息和库的特定于平台的名称,因此您只需根据需要链接到gtest_mainadd_subdirectory目标,CMake将为您完成剩下的工作

如果您希望CMake在CMake配置步骤中为您下载GoogleTest源代码,则this article会说明如何完成此操作。它包含一个完整的示例,它应该向您展示如何使其工作。该方法使用ExternalProject通过在配置时将其作为CMake脚本调用来执行下载阶段,而不是将下载延迟到构建时间。这使您可以调用function addChar(input, character) { if (input.value == null || input.value == "0"){ input.value = character} else{ input.value += character} }; $('#button-dot').click(function() { addChar(this.form.display, '.'); }); ,因为源会立即下载并可供CMakeLists.txt文件的后续部分使用。 更新:此方法现在也是part of the googletest documentation

另请注意,GoogleTest现已与GoogleMock合并,而规范回购邮件已moved to github

答案 2 :(得分:-1)

如果您不需要find_package,您是否尝试过使用

include(FindGTest)

使用gtest_add_tests

之前

在这里,我还要指出http://smspillaz.wordpress.com/2012/07/05/unit-test-autodiscovery-with-cmake-and-google-test/ 这似乎是GTEST_ADD_TESTS

的更好解决方案

免责声明:我自己都没试过。

相关问题