c++ - 如何克隆外部(来自 git)cmake 项目并将其集成到本地项目中

标签 c++ git cmake googletest

我在尝试使用 Google Test 时遇到了问题。

关于如何使用 ExternalProject_Add 将 gtest 添加到项目中的手册有很多,但是大多数手册描述了一种基于使用 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})

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

 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake.modules/")
 include(AddGTest)
....
 add_dependencies(${PROJECT_NAME} gtest)

但是这需要一个构建步骤。

这应该如何实现?

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

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

这是不正确的方法,因为在项目加载时文件夹不存在。

  1. 还有其他方法吗?

什么是正确/首选的方式?

最佳答案

我会选择第一种方法。您不需要指定构建命令,因为默认情况下使用 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)

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

关于c++ - 如何克隆外部(来自 git)cmake 项目并将其集成到本地项目中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38006584/

相关文章:

Git 良好实践,在两者都在发展时保持 fork 项目与其源来源保持同步

c++ - 在 Linux Mint 上使用 CMake 找不到 boost

c++ - 为什么在我的 C++ mips 反汇编程序中,没有打印出某些内容?

git - 我可以在没有 Visual Studio 的情况下将 Git 客户端与 TFS 一起使用吗?

c++ - 使用预处理器宏构建用于抛出 std::exception 的信息消息的简单方法

git - 如何使用git push prune删除远程分支

cmake - 在 cmake 中有选择地运行 doxygen

c++ - 未找到 Windows7 pthread.h

c++ - 我可以在 Visual Studio 中的 Lambda 中定义模板化函数

c++ - IDE如何从头文件.h中找到共享库名.so