для построения их.
есть несколько репозиториев 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
.
(Этот вопрос это самое близкое, что я мог найти, но оно немного более общее и остается без ответа.)