Cmake add_library НИКНЕЙМЫ

Я пытаюсь точно выяснить, для чего нужна строка это в файле cmake этого проекта github json,

add_library(${NLOHMANN_JSON_TARGET_NAME} INTERFACE)
add_library(${PROJECT_NAME}::${NLOHMANN_JSON_TARGET_NAME} ALIAS ${NLOHMANN_JSON_TARGET_NAME})

В частности, в этом примере, что это позволяет в этом файле cmake, что в противном случае было бы невозможно?

Я не вижу других ссылок на ${PROJECT_NAME}::${NLOHMANN_JSON_TARGET_NAME} в этом CMakeLists.cmake, поэтому я не понимаю, что именно это дает.

Редактировать:

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 895
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Использование функции git blame показывает, что в этот коммит была добавлена ​​строка: 33a2154, к которой прилагается следующий комментарий:

CMake convention is to use a project namespace, i.e. Foo::, for imported targets. When multiple targets are imported from a project, this looks like Foo::Bar1 Foo::Bar2, etc. This adds the nlohmann_json:: namespace to the exported target names.

This also allows the generated project config files to be used from the build directory instead of just the install directory.

Спасибо. хотя комментирование этой строки и повторное создание сборки приводит к идентичным выводам для сгенерированных файлов конфигурации.

rmawatson 19.11.2018 01:22
Ответ принят как подходящий

Это позволит использовать проект nlohmann/json, добавив его в свой суперпроект с помощью add_subdirectory (...)

Например, простая структура проекта:

<root project>\
     \thirdparty\json    <<-- git submodule to https://github.com/nlohmann/json
     \include\
     \src\
     CMakeLists.txt

В вашем проекте CMakeLists.txt

...
project(mySuperApp)

set(mySuperApp_SRC src/main.c)

# can under some conditions...
add_subdirectory(thirdparty/json)

add_executable(${PROJECT_NAME} ${mySuperApp_SRC})
target_link_libraries(${PROJECT_NAME} PRIVATE nlohmann_json::nlohmann_json)

Без псевдонима вы все равно можете добавить библиотеку через add_subdirectory, однако в команде target_link_libraries вам нужно будет опустить пространство имен:

project(mySuperApp)

set(mySuperApp_SRC src/main.c)

add_subdirectory(thirdparty/json)

add_executable(${PROJECT_NAME} ${mySuperApp_SRC})
target_link_libraries(${PROJECT_NAME} PRIVATE nlohmann_json)

Если вы сделали это, но затем решили использовать find_package для включения библиотеки (в отличие от add_subdirectory), вам нужно будет изменить target_link_libraries, чтобы использовать цели с пространством имен, т.е.

project(mySuperApp)

set(mySuperApp_SRC src/main.c)

find_package(nlohmann_json REQUIRED)

add_executable(${PROJECT_NAME} ${mySuperApp_SRC})
target_link_libraries(${PROJECT_NAME} PRIVATE nlohmann_json::nlohmann_json)

добавив псевдоним, target_link_libraries, использующие версию с пространством имен (например, nlohmann_json::nlohmann_json), будут работать в любом случае и не потребуют изменений, если вы позже решите переключиться с find_package на add_subdirectory).

Это позволяет вам добавить библиотеку с find_package ИЛИ add_subdirectory, используя одно и то же целевое имя для обоих:

# creates nlohmann_json::nlohmann_json
find_package(nlohmann_json REQUIRED)

if (nlohmann_json_NOT_FOUND)
    # creates nlohmann_json AND nlohmann_json::nlohmann_json
    add_subdirectory(thirdparty/json)
endif ()

add_executable(your_target_name ${your_target_sources})
target_link_libraries(your_target_name PRIVATE nlohmann_json::nlohmann_json)

Без псевдонима вам потребуются:

# creates nlohmann_json::nlohmann_json
find_package(nlohmann_json REQUIRED)

if (NOT nlohmann_json_FOUND)
    # creates only nlohmann_json
    add_subdirectory(thirdparty/json)
endif ()

add_executable(your_target_name ${your_target_sources})
if (nlohmann_json_FOUND)
    target_link_libraries(your_target_name PRIVATE nlohmann_json::nlohmann_json)
else()
    target_link_libraries(your_target_name PRIVATE nlohmann_json)
endif ()

Другие вопросы по теме