如何克隆和集成外部(从git)cmake项目到本地项目

ami*_*421 11 c++ git cmake googletest

当我尝试使用Google Test时,我遇到了一个问题.

有很多关于如何使用ExternalProject_Addgtest添加到项目中的手册,但是大多数这些手册描述了一种基于使用gtest下载zip存档并构建它的方法.

我们知道gtest是github托管和基于cmake的项目.所以我想找到原生的cmake方式.

如果这是一个仅限标题的项目,我会写一些类似于:

cmake_minimum_required(VERSION 2.8.8)
include(ExternalProject)
find_package(Git REQUIRED)

ExternalProject_Add(
    gtest
    PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/ext
    GIT_REPOSITORY https://github.com/google/googletest.git
    TIMEOUT 10
    UPDATE_COMMAND ${GIT_EXECUTABLE} pull
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
    LOG_DOWNLOAD ON
)

ExternalProject_Get_Property(gtest source_dir)
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include CACHE INTERNAL "Path to include folder for GTest")
set(GTEST_ROOT_DIR ${source_dir}/googletest CACHE INTERNAL "Path to source folder for GTest")
include_directories(${INCLUDE_DIRECTORIES} ${GTEST_INCLUDE_DIR} ${GTEST_ROOT_DIR})
message(${GTEST_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)

并从我的cmake项目添加此脚本,如:

 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake.modules/")
 include(AddGTest)
....
 add_dependencies(${PROJECT_NAME} gtest)
Run Code Online (Sandbox Code Playgroud)

但是,这需要构建步骤.

该如何实施?

  1. 通过添加BUILD_COMMANDExternaProject_Add,并与生产库链接?
  2. 或者通过将gtest的cmakelists包含到我的项目中,如下所示:

add_subdirectory (${CMAKE_SOURCE_DIR}\ext\src\gtest\googletest\CMakeLists.txt)

这是不正确的方法,因为在项目加载的那一刻文件夹不存在.

  1. 还有其他方法吗?

什么是正确/偏好的方式?

Dav*_*ant 21

我会采用第一种方法.您不需要指定构建命令,因为默认情况下使用cmake.这可能看起来像:

cmake_minimum_required(VERSION 3.0)
project(GTestProject)

include(ExternalProject)

set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external)

ExternalProject_Add(googletest
    GIT_REPOSITORY https://github.com/google/googletest
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION}
)

include_directories(${EXTERNAL_INSTALL_LOCATION}/include)
link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)

add_executable(FirstTest main.cpp)
add_dependencies(FirstTest googletest)
target_link_libraries(FirstTest gtest gtest_main pthread)
Run Code Online (Sandbox Code Playgroud)

如果有的话,我不知道这是否是正确/首选的方式.如果您想实现第二种方法,则必须首先使用execute_process下载代码.

  • [本文](https://crascit.com/2015/07/25/cmake-gtest/)记录了gtest手册现在的方式[也推荐](https://github.com/google/googletest/tree /主/ googletest#掺入 - 到 - 的存在-cmake的项目).CMake 3.11添加了[FetchContent模块](https://cmake.org/cmake/help/latest/module/FetchContent.html),它进一步扩展了方法,并使用gtest作为其示例之一. (3认同)