cmake 中组件和命名空间的命名约定

Mik*_*eMB 9 naming-conventions cmake

简而言之:

cmake 库目标是否有任何首选命名约定 - 特别是在使用命名空间时?

笔记:

除非真的有客观原因,否则我不是在问个人喜好,而是是否有“官方”(例如套件推荐)或已建立(可能偏离)的惯例。

细节:

假设我有一个库/框架foo,其中包含单独的组件barbaz. 到目前为止,我的命名约定是这样的:

add_library(foo-bar src1.cpp, scr2.cpp)
add_library(foo-baz src3.cpp, src4.cpp)
Run Code Online (Sandbox Code Playgroud)

现在我想使用命名空间 ( ::) 约定添加别名目标。例如

add_library(Foo::Bar ALIAS foo-bar)
add_library(Foo::Baz ALIAS foo-baz)
Run Code Online (Sandbox Code Playgroud)

(当然,这个问题也延伸到导出集,但我不想让问题复杂化)
然而,我无法真正发现的是,这些目标是否有首选甚至官方的命名约定。

我见过的东西:

  • 命名空间部分:
    • 有些项目似乎大写第一个字母,有些不是(前者似乎更常见)
  • 组成部分:
    • 在某些项目中,组件名称与二进制名称相同
    • 有或没有“lib”前缀(libfoo-bar vs foo-bar)
    • 有或没有命名空间(foo-bar vs bar)
    • 有些项目将第一个字母大写
    • 一些项目使用 CamelCase some snake_case,即使二进制文件或项目名称不遵循这些约定。

我想主要问题是一般没有库的命名约定,因此很难在 CMake 中提出命名约定,但至少命名空间和组件的第一个字母的大写字母似乎很漂亮很常见,所以我想知道是否有一些指导方针我应该在未来的项目中遵循。

Flo*_*ian 10

cmake-developer文件提供了有关命名空间的以下建议:

当提供导入的目标时,这些应该是命名空间的(因此是Foo::前缀);CMake 将识别传递给target_link_libraries()包含::在其名称中的值应该是导入目标(而不仅仅是库名称),并且如果该目标不存在,将生成适当的诊断消息(请参阅策略CMP0028)。

CMP0028政策文件说,在使用命名空间的“通用模式”:

双冒号的使用是用于命名空间IMPORTED目标和ALIAS目标的常见模式。在计算目标的链接依赖时,每个依赖的名称可以是目标,也可以是磁盘上的文件。以前,如果未找到具有匹配名称的目标,则该名称被认为是指磁盘上的文件。如果目标名称中存在拼写错误,这可能会导致混淆错误消息。

不,对于库目标的命名没有 CMake 特定的约定。但由于名称默认为目标的输出名称:

  • 我更喜欢为目标采用与我的源代码目录相同的名称
  • 并且不添加lib前缀,因为这是由 CMake 根据您编译项目的平台自动添加的

来自 CMake 教程

您可以获得的最官方来源可能是来自 Kitware 的 Ken Martin 和 Bill Hoffman 撰写的“掌握 CMake”一书的摘录。

书中教程都使用 CamelCase 并且没有组件/目标名称的命名空间。

参考

  • *“由于您在此处没有导入目标,建议不要使用名称空间。”* 您确定没有在句子中解释太多吗?如果 `my-lib-target-name` 应该是一个 cmake 目标(甚至是本地目标),我会很高兴直接从 cmake 那里听到它找不到所说的目标而不是 cmake 盲目地传递`- lfoo` 到链接器,编译器或链接器会抛出一些或多或少的神秘错误。我认为 `importet target` 的重要部分是 `target` 而不是 `imported`。 (2认同)