Управление cmake зависимостями git-модуль - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь настроить сборку cmake для одной из моих библиотек.Допустим, я хочу, чтобы библиотека B зависела от A. Обе библиотеки используют CMake в качестве системы сборки.Оба имеют внешнюю зависимость от gtest через git submodule.

.
+-libA
  |-CMakeLists.txt
  |...
  +-external/gtest
    +-CMakeLists.txt
+-libB
  |-CMakeLists.txt
  |...
  +-external/gtest
    +-CMakeLists.txt

Какова будет лучшая структура проекта, чтобы иметь возможность создавать проекты независимо и в рамках более крупного проекта?

СВ приведенном выше макете я получаю сообщение об ошибке, что gtest определяется другим проектом:

CMake Error at libstyxe/external/gtest/googletest/cmake/internal_utils.cmake:161 (add_library):                                               
  add_library cannot create target "gtest" because another target with the                                                                    
  same name already exists.  The existing target is a static library created                                                                  
  in source directory                                                                                                                         
  "libsolace/external/gtest/googletest".  See                                                                 
  documentation for policy CMP0002 for more details. 

Опции, которые я пробовал: 1. Сделать ссылку на libA из libB / external и включить ее через add_directory.Builind libB завершается с ошибкой, аналогичной приведенной выше.2. Создание корневого CMakeLists.txt с добавлением libA и libB в качестве add_subdirectory.Та же проблема.

В libA / CMakeLists.txt и libB / CMakeLists.txt gtest включен как: add_subdirectory(external/gtest/googletest EXCLUDE_FROM_ALL)

1 Ответ

0 голосов
/ 19 декабря 2018

Вы можете отключить проверки на дубликаты имен для текущего проекта, добавив следующую строку где-то в верхней части вашего основного CMakeLists.txt:

cmake_policy(SET CMP0002 OLD)

Возможно, отключение этих проверок приведет к другимпроблемы, но это может быть просто хакерский обходной путь, который вам нужен.

...