在OCaml中,两个第三方库公开相同的模块名称。连结失败

奥利弗·扬(Oliver Young)

我的项目正在使用ctypes库和标记库。编译时,会出现以下抱怨:

Error: Files /Users/Young/.opam/4.02.1/lib/markup/markup.cmxa
       and /Users/Young/.opam/4.02.1/lib/ctypes/ctypes.cmxa
       both define a module named Common

显然,两个库都公开相同的模块名称。如何解决?任何帮助将不胜感激。谢谢。

更新:我也不十分清楚为什么会有这样的冲突。据我了解,即使两个库都公开了相同的模块Common,它们也会显示为Ctypes.Common与Markup.Common。应该没有冲突吗?

静脉血

通常,如果不修改上游就无法解决此问题,因此,如果发生此类错误,则需要要求库维护者重命名相应的模块。

在您的情况下,使用较新版本的ctypes库应该会有所帮助,因为在我的机器上,ctypes(版本0.11.2)库不再定义Common模块。

更新:我也不十分清楚为什么会有这样的冲突。据我了解,即使两个库都公开了相同的模块Common,它们也会显示为Ctypes.Common与Markup.Common。应该没有冲突吗?

您的理解或多或少是正确的。但是,细节很少,库是编译单元的集合,每个编译单元是模块的集合。编译单元基本上映射到文件,例如,如果您有file common.ml,则编译单元将具有common名称。库和编译单元位于平面名称空间中,而模块通常位于分层名称空间中。这意味着,用于构建库的文件名必须具有不同的名称,这就是为什么如果您查看最新的代码库,将会注意到所有文件名都带有前缀ctypes_有一种解决方案,可以减轻打包空间模块的负担,在这种情况下,只能使用一个模块(通常与库具有相同的名称),以缓解此命名空间问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章