Module 在OCaml中,两个第三方库公开相同的模块名。链接失败

Module 在OCaml中,两个第三方库公开相同的模块名。链接失败,module,ocaml,build-system,opam,Module,Ocaml,Build System,Opam,我的项目正在使用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 显然,两个库都公开了相同的模块名。如何修复它?任何帮助都将不胜感激。谢谢 更新: 我也不太明白为什么会有

我的项目正在使用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。应该没有冲突吗

通常,如果不修改上游,您无法解决此问题,因此,如果出现此类错误,您需要要求库维护人员重命名相应的模块

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

更新:我也不太明白为什么会有这样的冲突。据我所知,即使两个库公开相同的模块Common,它们也将显示为Ctypes.Common vs Markup.Common。应该没有冲突吗


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

您必须向上游报告。谢谢您的评论。不幸的是,我使用的是async_ssl,它需要使用旧的async_ssl的ctypes版本,新的版本(例如async_ssl.113.+需要ctypes>=0.6)。据我所知,最新的async(从113版本开始)需要OCAML4.02.3或更高版本。谢谢。我会调查的。顺便说一句,我可以知道为什么模块之间会有这样的冲突吗?据我所知,即使两个库都公开了相同的模块Common,它们也会显示为Ctypes.Common vs Markup.Common.libraries基本上没有添加名称空间。如果两个库都公开模块
M
,那么它将在
M
名称下可用,没有任何前缀。图书馆只是一个档案馆。我已经更新了答案,让它更清楚。谢谢你的详细答案。这消除了我的疑虑。非常有用