Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.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
C++ CMake:重建外部项目_C++_Git_Cmake - Fatal编程技术网

C++ CMake:重建外部项目

C++ CMake:重建外部项目,c++,git,cmake,C++,Git,Cmake,我有一个使用外部库的项目。该项目的CMakeLists.txt如下所示: cmake_minimum_required(VERSION 3.6.0) project(my-project) set(CMAKE_CXX_STANDARD 14) include(ExternalProject) find_package(Git REQUIRED) ExternalProject_Add(library PREFIX ${my-project_SOURCE_DIR}/lib/

我有一个使用外部库的项目。该项目的CMakeLists.txt如下所示:

cmake_minimum_required(VERSION 3.6.0)

project(my-project)

set(CMAKE_CXX_STANDARD 14)

include(ExternalProject)
find_package(Git REQUIRED)

ExternalProject_Add(library
        PREFIX ${my-project_SOURCE_DIR}/lib/library
        GIT_REPOSITORY https://github.com/vendor/library
        GIT_TAG master
        UPDATE_COMMAND ""
        INSTALL_COMMAND ""
        )

link_directories(${my-project_SOURCE_DIR}/lib/library/src/library-build/src)

add_subdirectory(src)
include_directories(../lib/library/src/library/include)

add_executable(my-project
        main.cpp
        )

add_dependencies(my-project library)

target_link_libraries(my-project liblibrary.a)
和src/CMakeLists.txt,如下所示:

cmake_minimum_required(VERSION 3.6.0)

project(my-project)

set(CMAKE_CXX_STANDARD 14)

include(ExternalProject)
find_package(Git REQUIRED)

ExternalProject_Add(library
        PREFIX ${my-project_SOURCE_DIR}/lib/library
        GIT_REPOSITORY https://github.com/vendor/library
        GIT_TAG master
        UPDATE_COMMAND ""
        INSTALL_COMMAND ""
        )

link_directories(${my-project_SOURCE_DIR}/lib/library/src/library-build/src)

add_subdirectory(src)
include_directories(../lib/library/src/library/include)

add_executable(my-project
        main.cpp
        )

add_dependencies(my-project library)

target_link_libraries(my-project liblibrary.a)
它从Git中提取库并第一次毫无问题地构建它

我想编辑库的源代码并拥有库。自动重新编译文件。我能做到这一点的最干净的方法是什么?它当前会忽略对源代码的任何更新,因为它已经有了库的.a文件

当我尝试添加

add_subdirectory(lib/library/src/library/src)
对于我的主CMakeLists.txt,我得到以下错误:

lib/library/src/library/src/CMakeLists.txt:55(add_library)处的CMake错误:add_library无法创建目标“library”,因为已经存在另一个同名的目标。现有目标是在源目录“/cygdrive/c/Code/my project”中创建的自定义目标。有关更多详细信息,请参阅政策CMP0002的文档

我想这是因为打电话引起的

add_library(gram STATIC ${SOURCE_FILES})
在库CMakeLists.txt中,然后调用

ExternalProject_Add(library ...)
在项目CMakeLists.txt中


有什么想法吗?

因为使用
ExternalProject\u Add
的主要目标是从外部源下载依赖项,而无需配置和构建它,所以可以将
CMAKE\u命令
CONFIGURE\u命令
BUILD\u命令
定义为空字符串。与您对
UPDATE_命令
INSTALL_命令
所做的操作相同。这样,
ExternalProject\u Add
将只克隆存储库一次

要克服名称冲突,只需对
ExternalProject\u Add
的第一个参数使用不同的名称,例如
library\u src

ExternalProject_Add(library_src
    PREFIX ${my-project_SOURCE_DIR}/lib/library
    GIT_REPOSITORY https://github.com/vendor/library
    GIT_TAG master
    UPDATE_COMMAND ""
    CONFIGURE_COMMAND ""
    CMAKE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
)
ExternalProject_Get_Property(library_src SOURCE_DIR)
add_subdirectory(${SOURCE_DIR})

第二个命令(
ExternalProject\u Get\u Property
)将为您提供给定外部项目的命名属性。输出变量与属性的名称相同。这样,您就不会受到
ExternalProject\u Add
放置实际源代码树的行为变化的影响。

在ExternalProject\u Add中添加此命令可能会帮助您: 更新命令“”


包括另一个库(使用
添加子目录()
)或通过
外部项目添加()
。错误消息应该是直截了当的。正如您所看到的,我已经在使用
ExternalProject\u add()
,但它没有按预期工作<代码>添加子目录()本身无法从CVS克隆库。