C++ 在项目中全局构建和使用GTest
首先,我需要声明我一直在研究堆栈溢出问题,并得出了如何使用C++ 在项目中全局构建和使用GTest,c++,cmake,googletest,C++,Cmake,Googletest,首先,我需要声明我一直在研究堆栈溢出问题,并得出了如何使用ExternalProject在项目中构建googletest的答案 现在让我们假设我在我的项目中有这样的东西 +-- CMakeLists.txt (the big CMake File for the entire project) +-- tests | +-- CMakeLists.txt (contain of all the small project in the tests) | +-- Test1 |
ExternalProject
在项目中构建googletest的答案
现在让我们假设我在我的项目中有这样的东西
+-- CMakeLists.txt (the big CMake File for the entire project)
+-- tests
| +-- CMakeLists.txt (contain of all the small project in the tests)
| +-- Test1
| +-- CMakeLists.txt (test file for Test1 program)
| +-- test_1.cpp
| +-- test_1.h
| +-- Test2
| +-- CMakeLists.txt (test file for Test2 program)
| +-- test_2.cpp
| +-- test_2.h
| +-- Test3
| +-- CMakeLists.txt (test file for Test3 program)
| +-- test_3.cpp
| +-- test_3.h
现在,我是否可以使用大
CMakeLists.txt
文件(根文件夹)中的ExternalProject
配置和构建Google测试,然后使用这些库在相应的文件夹中构建每个单独的测试。目前,我只能在每个子文件夹Test1、Test2、Test3
中下载一整套新的GTest库,这是非常低效的。有没有其他方法可以解决这个问题?如果没有看到您的实际CMakeLists.txt文件,您的案例中发生了什么,我们就不清楚了。这就是说,按照正常方式使用,ExternalProject不会给您直接链接到的CMake目标,您必须做更多的手工工作,才能将一些内容添加到需要使用GTest的目标的链接库列表中。因此,根据您手动定义这些内容的方式,这可能就是您发现需要在每个TestX子目录中构建GTest的原因
在您链接到的另一个SO问题中,其中的链接文章提到了如何在CMake阶段而不是在构建时下载和构建GTest。这将为您提供CMake目标,您可以直接链接这些目标,而无需手动定义它们。如果按照该方法在顶级CMakeLists.txt文件中下载并构建GTest,则所有子目录都将看到
GTest
和GTest main
目标。此外,您不必为每个平台计算库的名称等,因为CMake目标已经为您处理了这个问题。因此,在您的各种Test1、Test2和Test3子目录中,您所要做的就是将gtest
或gtest\u main
添加到每个测试程序所链接的库列表中。我的方法是在测试项目的同一级别创建一个目录:
+-- CMakeLists.txt (the big CMake File for the entire project)
+-- tests
| +-- CMakeLists.txt (contain of all the small project in the tests)
| +-- gtest
| +-- CMakeLists.txt (use ExternalProject_Add to import GTest)
| +-- Test1
| +-- CMakeLists.txt (test file for Test1 program)
| +-- test_1.cpp
| +-- test_1.h
| +-- Test2
| ...
在gtest的CMakeLists.txt
中,我定义gtest目标并导出include dir和库路径的变量,供其他项目使用
它对我有效,我只构建了一次gtest,所以所有测试项目都可以链接到它。但我将尝试介绍Craig Scott在生成文件期间而不是在构建时构建gtest的方法
gtest
文件夹下的CMakeLists.txt
文件如下所示:
cmake_minimum_required(VERSION 2.8.11)
include(ExternalProject)
set(GMOCK_VERSION "1.7.0")
set(GMOCK_DIR "${CMAKE_CURRENT_BINARY_DIR}/gmock-${GMOCK_VERSION}")
ExternalProject_Add(project_gmock
SVN_REPOSITORY http://googlemock.googlecode.com/svn/tags/release-${GMOCK_VERSION}
PREFIX ${GMOCK_DIR}
CMAKE_ARGS -DCMAKE_C_COMPILER:PATH=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER:PATH=${CMAKE_CXX_COMPILER}
# Disable update step
UPDATE_COMMAND ""
# Disable install step
INSTALL_COMMAND ""
)
ExternalProject_Get_Property(project_gmock source_dir)
ExternalProject_Get_Property(project_gmock binary_dir)
include_directories(${source_dir}/gtest/include)
add_library(gtest STATIC IMPORTED GLOBAL)
set_target_properties(gtest PROPERTIES IMPORTED_LOCATION ${binary_dir}/gtest/libgtest.a)
set_target_properties(gtest PROPERTIES INCLUDE_DIRECTORIES ${source_dir}/gtest/include)
add_dependencies(gtest project_gmock)
get_property(GTEST_INCLUDE_DIR TARGET gtest PROPERTY INCLUDE_DIRECTORIES)
set(GTEST_INCLUDE_DIR "${GTEST_INCLUDE_DIR}" PARENT_SCOPE)
add_library(gtest_main STATIC IMPORTED GLOBAL)
set_target_properties(gtest_main PROPERTIES IMPORTED_LOCATION ${binary_dir}/gtest/libgtest_main.a)
add_dependencies(gtest_main project_gmock)
include_directories(${source_dir}/include)
add_library(gmock STATIC IMPORTED GLOBAL)
set_target_properties(gmock PROPERTIES IMPORTED_LOCATION ${binary_dir}/libgmock.a)
set_target_properties(gmock PROPERTIES INCLUDE_DIRECTORIES ${source_dir}/include)
add_dependencies(gmock project_gmock)
get_property(GMOCK_INCLUDE_DIR TARGET gmock PROPERTY INCLUDE_DIRECTORIES)
set(GMOCK_INCLUDE_DIR "${GMOCK_INCLUDE_DIR}" PARENT_SCOPE)
add_library(gmock_main STATIC IMPORTED GLOBAL)
set_target_properties(gmock_main PROPERTIES IMPORTED_LOCATION ${binary_dir}/libgmock_main.a)
add_dependencies(gmock_main project_gmock)
我必须承认,这是一个非常漂亮的解决方案!