Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Github 当repo(googletest)有多个库时,如何处理cmakeexternalproject?_Github_Cmake_Googletest - Fatal编程技术网

Github 当repo(googletest)有多个库时,如何处理cmakeexternalproject?

Github 当repo(googletest)有多个库时,如何处理cmakeexternalproject?,github,cmake,googletest,Github,Cmake,Googletest,当项目的repo不是我想要使用的库的根目录,但实际上包含两个目录,每个目录都是我想要在项目中使用的repo的根目录时,我如何在CMake中添加外部项目 我正在努力建立一个框架CMake项目,该项目使用Google Test和Mock进行测试,但是当我尝试下载带有ExternalProject\u Add的Google测试报告()时,它在构建时抱怨找不到项目的源代码。这是因为谷歌已经将googletest和googlemock合并为一个项目,但现在只有两个项目 回购协议的部分文件结构: googl

当项目的repo不是我想要使用的库的根目录,但实际上包含两个目录,每个目录都是我想要在项目中使用的repo的根目录时,我如何在CMake中添加外部项目

我正在努力建立一个框架CMake项目,该项目使用Google Test和Mock进行测试,但是当我尝试下载带有
ExternalProject\u Add
的Google测试报告()时,它在构建时抱怨找不到项目的源代码。这是因为谷歌已经将googletest和googlemock合并为一个项目,但现在只有两个项目

回购协议的部分文件结构:

googletest-master/
├──[...no CMakeFiles.txt exists here...]
├──googletest/
│  ├──src/
│  └──CMakeFiles.txt
└──googlemock/
   ├──src/
   └──CMakeFiles.txt
当我做以下事情时

ExternalProject_Add(
    gtest
    GIT_REPOSITORY https://github.com/google/googletest.git
    TIMEOUT 10
    INSTALL_COMMAND ""
    LOG_DOWNLOAD ON
    LOG_CONFIGURE ON
    LOG_BUILD ON
    PREFIX "googletest-master"
)
…它将实际的repo下载到
googletest master/src/gtest
,因为我在repo前面加上了“googletest master”以避免它出现在我的主要源代码中,并且它假设我正在下载的项目是唯一的源代码,并且源代码位于根目录中

所以我想完成两件事:

  • 将repo下载到googletest主目录中,就像我在那里克隆repo一样,或者下载zip-off-GitHub并将其解压缩一样
  • 在我的CMake项目中构建并包括googletest和googlemock
  • 我使用CMake导入gtest和gmock库,正如您所希望的,但是使用旧的SVN源代码库而不是GIT

    我认为关键是只获取gmock的源代码,因为它包括gtest源代码,然后导出这两个库

    下面的示例如下所示:

    cmake_minimum_required(VERSION 2.8)
    
    include(ExternalProject)
    
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    
    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)
    set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest.a)
    add_dependencies(gtest project_gmock)
    add_library(gtest_main STATIC IMPORTED)
    set_property(TARGET gtest_main PROPERTY IMPORTED_LOCATION ${binary_dir}/gtest/libgtest_main.a)
    add_dependencies(gtest_main project_gmock)
    include_directories(${source_dir}/include)
    add_library(gmock STATIC IMPORTED)
    set_property(TARGET gmock PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock.a)
    add_dependencies(gmock project_gmock)
    add_library(gmock_main STATIC IMPORTED)
    set_property(TARGET gmock_main PROPERTY IMPORTED_LOCATION ${binary_dir}/libgmock_main.a)
    add_dependencies(gmock_main project_gmock)
    
    include_directories(${cpp_utest_SOURCE_DIR}/src)
    set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
    #add_executable(utests )
    #target_link_libraries(utests gmock_main gmock gtest pthread)
    
    您需要一个下载步骤,但需要两个构建步骤。不同的
    ExternalProject\u add
    命令调用不能共享步骤,但您可以将所有这些步骤安排到具有适当依赖关系的不同调用中:

    # Single download(git clone)
    ExternalProject_Add(
        googletest-master
        DOWNLOAD_DIR "googletest-master/src" # The only dir option which is required
        GIT_REPOSITORY https://github.com/google/googletest.git
        TIMEOUT 10
        LOG_DOWNLOAD ON
        # Disable all other steps
        CONFIGURE_COMMAND ""
        BUILD_COMMAND ""
        INSTALL_COMMAND ""
    )
    
    # Build gtest from existing sources
    ExternalProject_Add(
        gtest
        DOWNLOAD_COMMAND "" # No download required
        SOURCE_DIR "googletest-master/src/googletest" # Use specific source dir
        PREFIX "googletest-master" # But use prefix for compute other dirs
        INSTALL_COMMAND ""
        LOG_CONFIGURE ON
        LOG_BUILD ON
    )
    
    # gtest should be build after being downloaded
    add_dependencies(gtest googletest-master)
    
    # Build gmock from existing sources
    ExternalProject_Add(
        gmock
        DOWNLOAD_COMMAND "" # No download required
        SOURCE_DIR "googletest-master/src/googlemock" # Use specific source dir
        PREFIX "googletest-master" # But use prefix for compute other dirs
        INSTALL_COMMAND ""
        LOG_CONFIGURE ON
        LOG_BUILD ON
    )
    
    # gmock should be build after being downloaded
    add_dependencies(gmock googletest-master)
    

    最后,我对一些相对路径进行了一些定制,以更好地满足我的需求/偏好——这个原始解决方案导致了一些看似不必要的复杂目录结构(googletest master/src/googletest/src)。但这是有效的,这正是我所需要的。