在OCaml中,两个第三方库显示相同的模块名称。未能链接

问题描述:

我的项目使用ctypes库和标记库。编译时,给出如下抱怨:在OCaml中,两个第三方库显示相同的模块名称。未能链接

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。应该没有冲突?

+0

你必须报告上游。 –

一般来说,如果不修改上游,就无法解决这个问题,所以如果出现这样的错误,您需要让库维护人员重新命名相应的模块。

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

更新:另外我不明白为什么会出现这样的冲突。据我的理解,即使两个库都暴露相同的模块Common,它们也会显示为Ctypes.Common vs Markup.Common。应该没有冲突?

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

+0

感谢您的评论。不幸的是,我使用了需要ctypes版本的async_ssl

+0

您使用的是旧版async_ssl(例如,async_ssl.113。+需要ctypes> = 0.6)。据我所知,最新的异步(从113版开始)需要OCaml 4.02.3或更高版本。 – ivg

+0

谢谢。将研究这一点。顺便说一句,我可以知道为什么我们会在模块之间产生这样的冲突?据我的理解,即使两个库都暴露相同的模块Common,它们也会显示为Ctypes.Common vs Markup.Common。 –