gpt4 book ai didi

CMake 和使用 git-submodule 进行依赖项目

转载 作者:行者123 更新时间:2023-12-01 09:48:22 34 4
gpt4 key购买 nike

考虑以下三个项目。
ProjectA没有任何依赖关系及其CMakeLists.txt顶层如下所示,

cmake_minimum_required(VERSION 2.8.4)
project(A CXX)
add_library(a ${PROJECT_SOURCE_DIR}/liba.cpp)
ProjectB取决于 ProjectA ,然后我添加 ProjectA作为一个 git 子模块,所以它的结构如下所示,
  • ProjectB
  • CMakeLists.txt
  • libb.cpp
  • ProjectA (git子模块)
  • CMakeLists.txt
  • liba.cpp

  • ProjectBCMakeLists.txt如下所示
    cmake_minimum_required(VERSION 2.8.4)
    project(B CXX)
    add_subdirectory(ProjectA)
    add_library(b ${PROJECT_SOURCE_DIR}/libb.cpp)
    target_link_libraries(b a)

    到目前为止还好。

    现在假设它来自 ProjectC .这取决于 ProjectAProjectB .假设我不知道 ProjectB取决于 ProjectA已经(例如,我之前没有创建这两个。或者认为 ProjectC 实际上有很多依赖关系,我不会被迫找出它们之间的确切依赖关系树)。

    无论如何,我都添加了 ProjectAProjectB作为 ProjectC 中的 git 子模块.所以它具有以下结构,
  • ProjectC
  • CMakeLists.txt
  • libc.cpp
  • ProjectA (git子模块)
  • CMakeLists.txt
  • liba.cpp
  • ProjectB (git子模块)
  • CMakeLists.txt
  • libb.cpp
  • ProjectA (子模块ProjectB的git子模块)
  • CMakeLists.txt
  • liba.cpp

  • 它有以下 CMakeLists.txt .
    cmake_minimum_required(VERSION 2.8.4)
    project(C CXX)
    add_subdirectory(ProjectA)
    add_subdirectory(ProjectB)
    add_library(c ${PROJECT_SOURCE_DIR}/libc.cpp)
    target_link_libraries(c a b)

    现在,如果我尝试运行 cmake对于 ProjectC ,我收到以下错误。
    add_library cannot create target "a" because another target with the same
    name already exists....

    我了解此错误的原因。这是因为 ProjectA被添加为子目录两次,所有目标由 add_library 创建是 全局 .对于这种特殊情况,我可以通过删除 add_subdirectory(ProjectA) 来修复它。在 ProjectC/CMakeLists.txt .但是,考虑 ProjectC 的情况。有很多依赖关系,它们之间可能存在也可能没有依赖关系。从 ProjectC 的开发者的角度来看,他应该不需要关心自己的依赖关系之间的相互依赖关系。

    在这种情况下,拥有 ProjectC 的最佳方法是什么?包括它的依赖?有 ProjectAProjectB作为源代码形式的 git-submodule 是必须的。我知道我可以简单地安装 ProjectAProjectB某处,和 ProjectC只需要在某处找到已安装的文件。但是,如果可能,我想避免这种解决方案(例如,如果安装是使用与 ProjectC 使用的不同的 ABI 构建的,则会出现不兼容问题)。我希望在 ProjectC 的构建树中构建所有三个项目.

    最佳答案

    可以查看目标是否a在调用 add_subdirectory 之前已经存在:

    if (NOT TARGET a)
    add_subdirectory(ProjectA)
    endif ()

    这样它只会为您的整个 CMake 项目添加一次子目录。

    关于CMake 和使用 git-submodule 进行依赖项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43761594/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com