我正试图弄清楚此github json项目的cmake文件中的this行是什么,
add_library(${NLOHMANN_JSON_TARGET_NAME} INTERFACE)
add_library(${PROJECT_NAME}::${NLOHMANN_JSON_TARGET_NAME} ALIAS ${NLOHMANN_JSON_TARGET_NAME})
特别是在此示例中,这在该cmake文件中允许什么?
在此CMakeLists.cmake中,我看不到对${PROJECT_NAME}::${NLOHMANN_JSON_TARGET_NAME}
的其他引用,因此我对实现的目的感到困惑。
编辑:
此操作实现的关键是,注释对我而言并不明显,即当通过add_subdirectory()使用项目时,它使目标与命名空间一起使用
答案 0 :(得分:1)
使用git的blame函数显示在此提交中添加了以下行:33a2154
,其中附加了以下注释:
CMake约定是对导入使用项目名称空间,即Foo :: 目标。从项目中导入多个目标时,这看起来 例如Foo :: Bar1 Foo :: Bar2等。这会将nlohmann_json ::名称空间添加到 导出的目标名称。
这还允许通过以下方式使用生成的项目配置文件: 构建目录,而不仅仅是安装目录。
答案 1 :(得分:1)
这将允许通过将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)
答案 2 :(得分:1)
它允许您使用 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()
答案 3 :(得分:0)
没有别名,您仍然可以通过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)
通过添加别名,使用命名空间版本(即nlohmann_json::nlohmann_json
)的target_link_libraries在两种情况下都可以工作,并且如果您以后决定从find_package
切换到add_subdirectory
,则无需更改)。