C++ CMake:重建外部项目
我有一个使用外部库的项目。该项目的CMakeLists.txt如下所示: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/
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克隆库。