【问题标题】:Nested library namespace in CMakeCMake 中的嵌套库命名空间
【发布时间】:2022-01-02 02:42:39
【问题描述】:

当我看到带有命名空间的 CMake 库时,它们总是采用以下形式 Parent::Component.

如果我有一个足够大的库,则该库的某些子部分可能包含组件。我想知道是否有可能/适合做类似ParentProject::Subgouping::SpecificComponent 或更真实的例子Raytracing::Math::Utils

简而言之,我可以在 CMake 库名称中使用多个命名空间吗?如果可能的话,这是个好主意吗?

【问题讨论】:

  • "我可以在一个 CMake 库名称中使用多个命名空间吗?" - 我看不到任何可以阻止这种用法的东西。你试过这样做吗?从技术上讲,除了简单的自检之外,CMake 不会以特定方式处理::。 “当我看到带有命名空间的 CMake 库时,它们总是采用 Parent::Component 的形式。” - 更准确地说,模式是Package::LibraryName。冒号之前的部分表示,(不是“父”项目或其他),冒号之后的部分是(不是“组件”)。跨度>
  • @Alec 请注意,即使使用 47 个组件进行提升也不会尝试做这样的事情。最好避免使用额外的“命名空间”并使用不同的分隔符:Raytracing::Math_Utils。不确定某些生成器/编译器/cpack 生成器是否可能存在问题,如果您不将自己限制在单个 ::...

标签: cmake namespaces


【解决方案1】:

简而言之,我可以在一个 CMake 库名称中使用多个命名空间吗?

是的。冒号 (:) 就像 CMake 目标名称中的任何其他字符一样。 然而target_link_libraries 命令会将其名称中包含:: 的任何参数解释为适当的 CMake 目标,而不是潜在的系统库。因此,如果您输入错误的目标名称或它不存在,您将在配置时收到一个有用的错误,而不是构建损坏。

在名称中包含多个 :: 实例的行为与只有一个实例相同。

如果可能的话,这是个好主意吗?

这和 C++ 中的嵌套命名空间一样好。如果有意义,就去做。唯一的细微差别是 CMake 没有 using namespace 等价物,因此输入起来不太方便。

在我的几个项目中,我使用像 Project::Tools:: 这样的命名空间来保存任何需要单独构建以便交叉编译的构建时工具(如自定义代码生成器)(当 CMAKE_CROSSCOMPILING_EMULATOR 不是一个选项)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2021-10-26
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多