для построения их.

есть несколько репозиториев Git, некоторые из которых содержат наш собственный код, а некоторые содержат слегка измененный код сторонней библиотеки. Упрощенный граф зависимостей выглядит следующим образом:

  executable_A
    |     |
    |     v
    |  library_B
    |     |
    v     v
   library_C

Таким образом, исполняемый файл имеет две зависимости отlibrary_Cодин прямой и один переходный. Я надеюсь связать все это вместе, используя подмодули Git и CMake, поэтому упрощенная структура каталогов выглядит следующим образом:

executable_A/
  CMakeListst.txt
  library_B/
    CMakeLists.txt
    library_C/
      CMakeLists.txt
  library_C/
    CMakeLists.txt

Как видите,library_C репозиторий включен как подмодуль дважды. Давайте предположим, что оба подмодуля указывают на один и тот же коммит (любые идеи о том, как обеспечить выполнение, приветствуются, но не являются темой этого вопроса).

Мы используемadd_subdirectory, target_link_libraries а такжеtarget_include_directories управлять этими взаимозависимостями. Довольно стандартный.

Проблема в том, что CMake не нравится, если вы создаете цель с одним и тем же именем дважды, поэтому он жалуется:

CMake Ошибка в library_C / CMakeLists.txt: 13 (add_library):
add_library не может создать цель "library_C", потому что другая цель с тем же именем уже существует. Существующей целью является статическая библиотека, созданная в исходном каталоге "... / library_B / library_C".
См. Документацию для политики CMP0002 для более подробной информации.

Я бы не хотел удалять прямую зависимостьexecutable_A наlibrary_C, потому что тот факт, что он втягивается черезlibrary_B это деталь реализацииlibrary_B на это не следует полагаться. Более того, этот подход сломается, как только мы добавим еще одну зависимость, такую ​​какexecutable_A --> library_D --> library_C.

(Этот вопрос это самое близкое, что я мог найти, но оно немного более общее и остается без ответа.)

Ответы на вопрос(1)

Ваш ответ на вопрос