Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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
在CMake中隔离gitsubmodule项目 我试图使用CMASE和GITSUB模块管理我的C++项目依赖关系。我遵循这里描述的布局:它在较小的项目中非常适合我。但我已经开始在更大的项目上使用它,我遇到了一些关于CMake的问题 我当前的设置_C++_Cmake_Git Submodules - Fatal编程技术网

在CMake中隔离gitsubmodule项目 我试图使用CMASE和GITSUB模块管理我的C++项目依赖关系。我遵循这里描述的布局:它在较小的项目中非常适合我。但我已经开始在更大的项目上使用它,我遇到了一些关于CMake的问题 我当前的设置

在CMake中隔离gitsubmodule项目 我试图使用CMASE和GITSUB模块管理我的C++项目依赖关系。我遵循这里描述的布局:它在较小的项目中非常适合我。但我已经开始在更大的项目上使用它,我遇到了一些关于CMake的问题 我当前的设置,c++,cmake,git-submodules,C++,Cmake,Git Submodules,我的所有外部生成依赖项都位于主项目中的contrib/子文件夹中。每个模块都是一个子模块,并有自己的单独目录。 /contrib -/本征 -/卷曲 -/leapserial -/zlib -/opencv 等 contrib/CMakeListst.txt只需初始化子模块,并为每个外部依赖项添加子目录 # EIGEN execute_process(COMMAND git submodule update --recursive --init -- eigen WORKING_DIREC

我的所有外部生成依赖项都位于主项目中的
contrib/
子文件夹中。每个模块都是一个子模块,并有自己的单独目录。

/contrib
-/本征
-/卷曲
-/leapserial
-/zlib
-/opencv
等

contrib/CMakeListst.txt只需初始化子模块,并为每个外部依赖项添加子目录

# EIGEN
execute_process(COMMAND git submodule update --recursive --init -- eigen
 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# options..
add_subdirectory(eigen EXCLUDE_FROM_ALL)

# CURL
execute_process(COMMAND git submodule update --recursive --init -- curl
 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# Initialize cache with CMake build options..
add_subdirectory(curl EXCLUDE_FROM_ALL)

# LEAP SERIAL
execute_process(COMMAND git submodule update --recursive --init -- leapserial
 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# Initialize cache with CMake build options..
add_subdirectory(leapserial EXCLUDE_FROM_ALL)

# ZLIB
execute_process(COMMAND git submodule update --recursive --init -- zlib
 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# Initialize cache with CMake build options..
add_subdirectory(zlib EXCLUDE_FROM_ALL)

# OPENCV
execute_process(COMMAND git submodule update --recursive --init -- opencv
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# Initialize cache with CMake build options..
add_subdirectory(opencv EXCLUDE_FROM_ALL)
这个设置对我来说非常有效:

  • 它是独立于系统/包管理器的。您无需安装任何库即可开始开发
  • 我可以通过将子模块设置为特定的提交来维护依赖项的确切版本。有些外部库破坏了您的构建,这并不奇怪
  • 在root
    CMakeListst.txt
    中将库添加到我的构建中非常简单。既然我有目标,我就有
    
    添加可执行文件(SomeProjectmWorkingon)
    ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp)
    目标链接库(一些项目工作)
    opencv_世界
    本征
    兹利布
    )
    
  • 当您将现有库目标连接到自己的目标可执行文件/库时,CMake将自动(通过目标接口)向目标添加包含目录,并添加库目标使用它所需的任何其他必要选项
  • 我可以在根CMakeLists.txt中选择一个工具链/编译器选项/构建类型,它将传播到所有子项目(我需要为多个系统构建。所以这是一件大事)
  • 由于它是一个“大型项目”,因此很容易连接到rtag/kdevelop/clion,不仅可以在自己的代码上导航,还可以在库代码上导航
  • 一些我无法解决的问题: 1. 子目录将定义具有相同名称的目标。在我给出的示例中,Egen OpenCV和另一个库都定义了一个“卸载”目标

    我试着更新了文件

    add_subdirectory(blah)
    

    但出于某种原因,这并不能解决问题

    启用变量
    ALLOW\u DUPLICATE\u CUSTOM\u TARGETS
    kind。。但这是一种黑客行为,只处理Make文件,而且这些库基本上仍然是“混合”的,所以这仍然是一个问题

    2. 第二个问题在LeapSerial中提出,但说明了一个更大的问题。项目不再知道自己的名字。LeapSerial试图确定LeapSerial的版本,但当它要求项目版本时,它得到的是根项目版本。当子项目中的cmake代码要求“我在哪个项目中”时,它得到的是根项目,而不是它所在的直接项目

    同样,父“名称空间”到处都在泄漏。这必然会造成越来越多的问题。我需要将子模块设置为自包含的

    有更清洁的解决方案吗


    ExternalProjectAdd可能会解决其中一些问题,但它自己也有很多问题。这是一个真正的非初学者b/c,它不做我列出的大部分工作。核心问题是,它不会暴露子项目的目标,只会吐回变量,然后你必须处理这些变量

    编写该教程的人肯定需要阅读。
    ExternalProject\u Add
    比你想象的更方便。例如,
    git
    和修订版已经纳入其中。至于“它不公开子项目的目标”,与
    execute\u process
    (也就是说,3d party Library构建在配置步骤上)相结合,它允许使用
    find\u package
    作为外部库。对于
    add_subdirectory()
    方法,目标和变量冲突是不可避免的。CMake既不提供变量也不提供目标名称空间。对,但是
    find_package
    只是返回一些您必须管理的变量。它不会像使用
    target\u link\u库时那样自动处理所有内容。它也不会干净地管理工具链并与IDE绑定我猜如果没有名称空间,那么我猜我就完蛋了:(CMake不是一个足够成熟的工具,不适合轻松开发yetI最终通过使用Hunter软件包管理器解决了这个问题。它100%基于CMake,非常适合我的需要
    
    add_subdirectory(blah EXCLUDE_FROM_ALL)