Я пытаюсь точно выяснить, для чего нужна строка это в файле 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 ().





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