cmake: add_library не может создать цель "cxx", потому что другая цель с таким именем уже существует - PullRequest
0 голосов
/ 04 апреля 2020

Я использую проект, который имеет следующие зависимости:

grp c

  • googletest
  • тест

В то же время у моего проекта есть эталонные тесты.

Когда я объявляю следующие зависимости, используя FetchContent, я получаю следующую ошибку:

add_library cannot create target "benchmark" because another target
  with the same name already exists.  The existing target is an executable
  created in source directory

My CMakeLists.txt is:

cmake_minimum_required(VERSION 3.15)
project(dahj)

set(CMAKE_CXX_STANDARD 14)

include(FetchContent)

FetchContent_Declare(
        grpc
        GIT_REPOSITORY https://github.com/grpc/grpc.git
        GIT_TAG v1.17.2
)
FetchContent_MakeAvailable(grpc)

FetchContent_Declare(
        benchmark
        GIT_REPOSITORY https://github.com/google/benchmark.git
        GIT_TAG v1.5.0
)
FetchContent_MakeAvailable(benchmark)

add_executable(dahj main.cpp grpc++)

Я знаю, что могу использовать бенчмарк, не извлекая его, а просто связывая его. Но если grpc решит снять тестирование в качестве зависимости, это испортит мою сборку. Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 04 апреля 2020

Вызывайте FetchContent_Declare и FetchContent_MakeAvailable для benchmark только тогда, когда еще не создана цель «эталон»:

if (NOT TARGET benchmark)
    FetchContent_Declare(
            benchmark
            GIT_REPOSITORY https://github.com/google/benchmark.git
            GIT_TAG v1.5.0
    )
    FetchContent_MakeAvailable(benchmark)
endif()

Это безопасно предотвратит включение проекта benchmark дважды.

См. Также этот вопрос: CMake: несколько подпроектов используют один и тот же статус c библиотека

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...