Ocaml / ReasonML — Отсутствующие библиотеки во встроенном исполняемом файле

У меня есть проект ReasonML, который использует dune build для создания исполняемого файла. Исполняемый файл запускается на машине разработки (где создается код) без каких-либо проблем. Однако, если я скопирую этот exe-файл на другой ноутбук (другой Mac с той же версией OSX), я не смогу выполнить файл из-за отсутствия библиотек:

dyld: Library not loaded: /usr/local/opt/gmp/lib/libgmp.10.dylib
  Referenced from: /usr/local/bin/foo
  Reason: image not found

Я не очень разбираюсь в ocaml/reason, но я ожидал, что исполняемый файл будет включать все необходимые зависимости в двоичный файл.

Есть ли специальный флаг сборки или какой-то другой шаг, который я должен выполнить помимо dune build, чтобы включить все необходимые библиотеки?


person tomraithel    schedule 27.01.2020    source источник
comment
Если вы создаете серверную службу, помните, что для ее развертывания обычно требуется Dockerize. Таким образом, связывание библиотек становится не проблемой. Если вы создаете CLI для распространения среди пользователей, то да, вам нужно решить проблему связывания :-)   -  person Yawar    schedule 28.01.2020


Ответы (1)


То, что вы ищете, это статическое связывание двоичных файлов. MacOS, к сожалению, официально не поощряет и не рекомендует статическое связывание. Старую страницу можно найти здесь. Вы также можете найти этот ответ Stackoverflow полезным.

Это не столько связано с самим OCaml, сколько с тем, как компоновщики ведут себя на разных платформах (MacOS, Linux и т. д.).

Чтобы решить вашу проблему, вы можете проверить esy-gmp, предполагая, что вы используете esy в качестве менеджера пакетов. Если вы используете OPAM, вы можете добавить conf-gmp тебе опам зависимостей

При всем этом, если вы заинтересованы в статической компоновке на поддерживаемой платформе, такой как Linux (и Windows тоже, я думаю?), вам придется предоставить флаги компоновщика C через dune.

(link_flags (-ccopt -static))
person Community    schedule 27.01.2020