简述:
在使用命名空间时,cmake库目标是否有首选的命名约定?
注意:
除非确实有客观原因,否则我不是在询问个人偏好,而是在问是否存在“官方”(例如,由kitware推荐)或已经建立的(可能有所偏差)惯例。
详细信息:
假设我有一个名为foo
的库/框架,其中包含独立的组件bar
和baz
。到目前为止,我的命名约定看起来像这样:
add_library(foo-bar src1.cpp, scr2.cpp)
add_library(foo-baz src3.cpp, src4.cpp)
现在我想使用命名空间(
::
)约定来添加别名目标。例如:add_library(Foo::Bar ALIAS foo-bar)
add_library(Foo::Baz ALIAS foo-baz)
(当然,这个问题也适用于导出集,但我不想让问题变得更加复杂)但是,我确实找不到有关这些目标的首选命名约定甚至官方命名约定。
我看到过以下内容:
命名空间部分: 某些项目似乎将第一个字母大写,而另一些则没有(前者似乎更常见)
组件部分: 在某些项目中,组件名称与二进制名称相同 使用或不使用“lib”前缀(libfoo-bar vs foo-bar) 使用或不使用命名空间(foo-bar vs bar) 某些项目将第一个字母大写 某些项目使用CamelCase或snake_case,即使二进制文件或项目名称不遵循这些约定。
我猜主要问题是一般情况下没有库的命名约定,所以这使得在CMake中制定命名约定比较困难,但至少命名空间和组件的首字母大写似乎相当普遍,因此我想知道是否应该遵循某些指南来处理未来的项目。
my-lib-target-name
应该是一个 cmake 目标(即使是本地目标),我很高兴直接从 cmake 听到它找不到该目标,而不是 cmake 盲目地将-lfoo
传递给链接器,然后编译器或链接器抛出一些更或多或少加密的错误。我认为“导入目标”的重要部分是“目标”,而不是“导入”。 - MikeMBXxx_
似乎表明,至少对于包名和命名空间,首字母大写是首选。 - MikeMBtarget_link_library(my_lib Foo::foo)
不需要先定义Foo::foo
。 - MikeMBtarget_link_libraries()
调用中也可以使用带有命名空间的目标。而且,当目标不是项目的一部分时,使用cmake_policy(SET CMP0028 NEW)
会出现类似于 "Target "MyExe" links to target "Foo::Bar" but the target was not found." 的错误。我之前并不知道这一点,不得不承认这是一个非常方便的目标名称命名空间特性。 - Florian