我想在CMake项目中使用gtest。以前,我已经构建了gtest并将头文件和库复制到可以找到它们的位置,以便克服缺少Ubuntu包来提供相同的功能。
gtest开发人员推荐的方法是build gtest inside the project that is using it。
但是,我还想使用CMake GoogleTest module中定义的gtest_add_tests
和gtest_discover_tests
函数。
但find_package(GTest REQUIRED)
失败了,因为图书馆还没有建成:
Could NOT find GTest (missing: GTEST_LIBRARY GTEST_MAIN_LIBRARY)
所以看起来它必须是一个两阶段的过程,并且没有办法保证遵守“一个定义规则”。我是否需要编写定义函数的自定义FindGTest.cmake,但不查找库,以便它们只有在cmake完成后才可用并构建它们?
答案 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_main
和gtest
CMake目标,而这些目标非常方便。例如,它们带有依赖项信息和库的特定于平台的名称,因此您只需根据需要链接到gtest_main
或add_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
的更好解决方案免责声明:我自己都没试过。