首页 > 解决方案 > CMakeLists.txt 中的命名空间符号?

问题描述

我刚刚克隆了libigl 存储 ,我的目标是破解其中一个示例。我首先将其中一个教程移动到不同的文件夹中。然而,每个 CMakeLists.txt 如下所示:

get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME)
project(${PROJECT_NAME})

add_executable(${PROJECT_NAME}_bin main.cpp)
target_link_libraries(${PROJECT_NAME}_bin igl::core igl::opengl igl::opengl_glfw tutorials)

我不是 CMake 方面的专家,但我从未见过类似的语法igl::core igl::opengl igl::opengl_glfw

谁能告诉我这是什么意思?它像 C++ 中的命名空间吗?顶层 CMake是一个名为的项目,libigl因此它必须以某种方式相关。

标签: c++cmake

解决方案


文档

双冒号的使用是用于命名 IMPORTED 目标和 ALIAS 目标的常见模式。在计算目标的链接依赖项时,每个依赖项的名称可以是目标,也可以是磁盘上的文件。以前,如果找不到具有匹配名称的目标,则该名称被认为是指磁盘上的文件。如果应该是目标名称有错字,这可能会导致令人困惑的错误消息。

此外,从这里

导出安装目标时指定带有双冒号的NAMESPACE 。这种双冒号的约定给 CMake 一个提示,即当下游使用 target_link_libraries() 命令使用该名称时,该名称是一个 IMPORTED 目标。这样,如果尚未找到提供它的包,CMake 可以发出诊断。

因此,命名空间可以在以下 CMake 代码段中使用:

export(EXPORT ClimbingStatsTargets
  FILE "${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsTargets.cmake"
  NAMESPACE Upstream::
)

推荐阅读