相关疑难解决方法(0)

如何使用Git子模块和CMake处理传递依赖冲突?

我们有许多Git存储库,其中一些包含我们自己的代码,一些包含稍微修改过的第三方库代码.简化的依赖关系图如下所示:

  executable_A
    |     |
    |     v
    |  library_B
    |     |
    v     v
   library_C
Run Code Online (Sandbox Code Playgroud)

所以可执行文件有两个依赖项library_C,一个是直接的,一个是传递的.我希望使用Git子模块和CMake将它们组合在一起,因此简化的目录结构如下所示:

executable_A/
  CMakeListst.txt
  library_B/
    CMakeLists.txt
    library_C/
      CMakeLists.txt
  library_C/
    CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

如您所见,library_C存储库作为子模块包含两次.让我们假设两个子模块都指向同一个提交(关于如何强制执行的任何想法都是受欢迎的,但不是这个问题的主题).

我们正在使用add_subdirectory,target_link_librariestarget_include_directories管理这些相互依存关系.很标准.

问题是如果你创建一个具有相同名称的目标两次,CMake不喜欢它,所以它会抱怨:

library_C/CMakeLists.txt上的CMake错误:13(add_library):
add_library无法创建目标"library_C",因为已存在具有相同名称的另一个目标.现有目标是在源目录".../library_B/library_C"中创建的静态库.
有关更多详细信息,请参阅策略CMP0002的文档.

我宁愿不删除executable_Aon 的直接依赖library_C,因为它被拉入via的事实library_B是一个library_B不应该依赖的实现细节.而且,一旦我们添加了另一个依赖项,这种方法就会崩溃executable_A --> library_D --> library_C.

(这个问题是我能找到的最接近的问题,但是有点笼统,但仍然没有答案.)

c++ cmake git-submodules

16
推荐指数
1
解决办法
1170
查看次数

标签 统计

c++ ×1

cmake ×1

git-submodules ×1