2017-02-20 30 views
4

В моем проекте используется библиотека 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

Вам нужно будет сообщить о выходе. –

ответ

4

В общем, вы не можете решить эту проблему без изменения восходящего потока, поэтому в случае возникновения таких ошибок вам необходимо попросить разработчиков библиотек переименовать соответствующие модули.

В вашем случае использование новой библиотеки ctypes должно помочь, так как на моей машине библиотека ctypes (версия 0.11.2) больше не определяет модуль Common.

Обновление: Также я не совсем понимаю, почему возникнет такой конфликт. Насколько я понимаю, даже если обе библиотеки выставляют один и тот же модуль Common, они будут отображаться как Ctypes.Common vs Markup.Common. Не должно быть конфликта?

Ваше понимание более или менее верное. Однако есть несколько деталей, библиотека представляет собой набор единиц компиляции, каждый блок компиляции представляет собой набор модулей. Компиляционные модули в основном сопоставляются с файлами, например, если у вас есть файл common.ml, тогда блок компиляции будет иметь имя common. Библиотеки и единицы компиляции находятся в плоском пространстве имен, а модули обычно оставляют в иерархическом пространстве имен. Это означает, что имена файлов, из которых создаются библиотеки, должны иметь разные имена, поэтому, если вы посмотрите на последнюю кодовую базу, вы заметите, что все имена файлов имеют префикс с ctypes_. Существует частичное решение, чтобы смягчить эту проблему с пространством имен, можно использовать упакованные модули, в этом случае только один модуль (обычно с тем же именем, что и библиотека).

+0

Спасибо за комментарии. К сожалению, я использую async_ssl, для которого требуется версия ctypes <= 0.4.0 –

+0

. Вы используете старый async_ssl, новый (например, async_ssl.113. + Требует ctypes> = 0.6). Насколько мне известно, последний асинхронный (начиная с версии 113) требует OCaml 4.02.3 или выше. – ivg

+0

Спасибо. Посмотрите на это. Кстати, могу я знать, почему у нас такой конфликт между модулями? Насколько я понимаю, даже если обе библиотеки выставляют один и тот же модуль Common, они будут отображаться как Ctypes.Common vs Markup.Common. –

 Смежные вопросы

  • Нет связанных вопросов^_^