在 OCaml 中,两个第三方库公开相同的模块名称。未能 link

In OCaml, two third party libraries expose same module name. Failure to link

我的项目正在使用 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 vs Markup.Common。应该没有冲突吧?

一般情况下,不修改upstream是解决不了的,所以遇到这种错误,需要请库维护者重命名相应的模块。

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

Update: Also I don't quite understand why there'll be such a conflict. To my understanding, even if both libraries expose the same module Common, they will appear as Ctypes.Common vs Markup.Common. There's should be no conflict?

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