ein*_*ica 13 namespaces cmake semantics
在现代 CMake 中,习惯上在命名空间内导出目标,例如导出foo
项目foo::foo
,也许还有foo::bar
其他。
我的问题是:这些命名空间本身是否真的意味着什么,或者它们只是单个名称的一部分,而没有 CMake 分隔分隔的::
名称组件?
如果前者是正确的,你能说“命名空间中的所有目标”之类的东西吗?或者以其他方式使用命名空间?
我还没有看到任何允许单独处理命名空间导出目标的名称组件的 CMake 功能。但我发现 CMake 命名空间仍然有一个含义,即它们影响 CMake 的行为:
\n::
使用调用中包含的目标名称target_link_libraries(\xe2\x80\xa6)
将确保 CMake 仅将其解析为通过find_package(\xe2\x80\xa6)
. 它可以防止通常的回退机制尝试将其解析为磁盘上的库文件名(就像在磁盘上-lName
查找的位置一样libName.so
)。
该行为记录在CMake 策略 0028中。它不一定在所有地方都启用,但如果没有启用,CMake \xe2\x89\xa53.0.2 会发出警告。
\n这也很有用。我刚刚遇到了一个由 CMake 的回退行为引起的令人困惑的问题(请参阅 参考资料)。因此,我将严格在::
in中使用命名空间目标名称target_link_libraries(\xe2\x80\xa6)
。
遗憾的是,从另一篇 CMake 文档来看,识别 IMPORTED 目标的功能似乎是 CMake 命名空间的唯一含义:
\n\n\n\n
NAMESPACE
导出安装目标时指定带双冒号的A。这种双冒号约定向 CMake 提示,IMPORTED
当下游通过命令使用该名称时,该名称是一个目标target_link_libraries()
。这样,如果尚未找到提供诊断的包,CMake 可以发出诊断。
乍一看,在我看来,每个 CMake 包都有一个命名空间,每个包组件在该命名空间中有一个目标名称。这样,在 a 之后,find_package(noms COMPONENTS fruit veg)
您就noms::fruit
可以noms::veg
使用target_link_libraries(\xe2\x80\xa6)
. 但这只是当前广泛(且有用)的做法。从技术上讲,包组件不一定映射到一个目标(详细信息)。
归档时间: |
|
查看次数: |
4733 次 |
最近记录: |