Cmake add_library ALIAS - PullRequest
       3

Cmake add_library ALIAS

0 голосов
/ 19 ноября 2018

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

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Это позволит использовать проект 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)
0 голосов
/ 24 июля 2019

Без псевдонима вы все равно можете добавить библиотеку с помощью 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).

0 голосов
/ 19 ноября 2018

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

Соглашение CMake заключается в использовании пространства имен проекта, т.е. Foo ::, для импортированных целей.Когда несколько целей импортируются из проекта, это выглядит как Foo :: Bar1 Foo :: Bar2 и т. Д. Это добавляет пространство имен nlohmann_json :: name к экспортируемым именам целей.

Это также позволяет генерировать файлы конфигурации проектадля использования из каталога сборки вместо каталога установки.

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