gpt4 book ai didi

namespaces - CMake:强制命名空间和库文件名之间的关系

转载 作者:行者123 更新时间:2023-12-04 01:45:04 25 4
gpt4 key购买 nike

似乎 CMake 不支持定义导出或安装目标的命名空间与相应库文件的名称之间的关系。

因此,例如,CMake 可以轻松创建包含明确命名的目标(例如 MyOrg::MyLibrary)的包。 (使用 NAMESPACEexport(EXPORT ...) 命令的 install(EXPORT ...) 选项,但实际的 .a、.lib、.so 或 .dll 文件仍将获得全局间隔的名称,例如 libMyLibrary.a :命名空间确实如此不输入库文件名。

当然也可以自己为目标应用命名空间;在上面的例子中,你可以命名你的目标 MyOrgMyLibrary ,导致库文件名,例如“libMyOrgMyLibrary.a”。我想这是可以的,除了这使得 NAMESPACE选项基本上没用(或者你最终会得到名为 MyOrg::MyOrgMyLibrary 的目标),让我觉得我错过了一些东西。

有没有办法覆盖生成的库的名称?或者使用 CMake 确保库文件获得明确名称的“正确”方式是什么?

最佳答案

整个命名空间的功能远不如其名称所暗示的那么强大。它实际上只不过是一个命名约定。我看到了附带大量库的大型框架的主要优势(例如 Qt ),但您是对的,它本身并没有太大用处。

另请注意,该机制仅关注避免 CMake 脚本中的名称冲突,而不关注文件系统上的名称冲突。后者需要在另一个层面上解决。避免这些的最简单方法当然是将库安装到子目录中。那么你几乎只需要担心你自己的项目中的名称冲突。不幸的是,这种方法有其自身的缺点。在 Unix 上,不鼓励用户创建到 /usr/lib 的子目录。 ,除了存储特定于应用程序的库(感谢@JPNotADragon for pointing this out)。

否则,像前缀这样的常用技术将适用,您已经提到过。

我同意,此功能并不像人们希望的那样强大。但话又说回来,名称冲突是一个重要的问题,最终合理的命名约定可能仍然是最好的解决方案。

关于namespaces - CMake:强制命名空间和库文件名之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25983741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com