Как скомпилировать код ocaml в нативный для использования в C ++

Как я могу скомпилировать эту библиотеку парсера facebook до нативного кода, чтобы ее можно было импортировать моей программой на C ++ https://github.com/facebook/flow/tree/master/src/parser

Я пробовал использовать ocamlopt и dune build, но, похоже, есть ошибки.

File "src/services/saved_state/dune", line 7, characters 4-29:
7 |     saved_state_dummy_fetcher
        ^^^^^^^^^^^^^^^^^^^^^^^^^
Error: Module Saved_state_dummy_fetcher is excluded but it doesn't exist.

Спасибо


person mingsterism    schedule 13.04.2020    source источник


Ответы (1)


OCaml - это язык, отличный от C или C ++, и он использует другие соглашения о вызовах и двоичный интерфейс (ABI), чем C или C ++. Ничего особенного в OCaml здесь нет, даже код, скомпилированный разными компиляторами C ++, в общем, несовместим и не может быть импортирован.

Итак, если вы хотите вызвать библиотечную функцию, написанную на языке A, из программы, написанной на языке B, вы должны использовать привязки. Если привязок нет, вы можете написать свой собственный, хотя это нетривиальный проект, поскольку вам нужно решить, как преобразовать структуры данных C в структуры данных OCaml и наоборот. Если вы или кто-то другой решите следовать по этому маршруту, вот несколько советов. В официальной документации описаны низкие -уровневый интерфейс. Интерфейс более высокого уровня и менее подверженный ошибкам интерфейс предоставляется библиотекой CTypes (которая также может сгенерировать код C, который позже можно будет скомпилировать в файл .so).

Конечно, перед написанием заглушек вы также должны изучить, как скомпилировать потоковый проект, поскольку отображаемая ошибка не имеет ничего общего с импортом кода OCaml в проект C или C ++. Вы должны следовать инструкциям, предоставленным на домашней странице потока.

person ivg    schedule 13.04.2020
comment
Если вы решили использовать ctypes, вот пример вызова функций OCaml из C / C ++ github.com/yallop/ocaml-ctypes-inverted-stubs-example. Вот тот же пример, если вы используете Esy в качестве диспетчера пакетов - github.com/prometheansacrifice/ esy-инвертированные-ctypes-stubs - person ; 15.04.2020