Скажем, я создаю приложение в Racket.
И, скажем, в конечном итоге я хочу скомпилировать это приложение в виде единого двоичного файла, который можно было бы распространять среди пользователей без установки Racket или каких-либо других программных библиотек. Я верю, что это возможно, да?
Скажем, в этом приложении я хочу использовать пакет snappy https://docs.racket-lang.org/snappy/, который является оберткой FFI для библиотеки C++.
Я уже столкнулся с небольшой проблемой. Я сделал (require snappy)
внутри DrRacket, следуя инструкциям и установив пакет, но получаю сообщение об ошибке:
../../Applications/Racket v7.7/collects/racket/private/kw.rkt:1349:57:
ffi-lib: couldn't open "libsnappy.1.dylib" (dlopen(libsnappy.1.dylib, 6): image not found)
Из этого я могу предположить, что racket-snappy ожидает, что файлы для libsnappy
будут находиться на обычном пути unix, но я нахожусь на macos, и мой установлен через Homebrew где-то еще. Я считаю, что ответ на эту проблему здесь https://stackoverflow.com/a/24287418/202168
Меня беспокоит следующее: я не хочу, чтобы пользователям моего приложения приходилось устанавливать эти библиотеки через Homebrew и возиться с путями и т. д.
Я новичок в Racket и практически ничего не знаю о цепочке инструментов компилятора или C / C ++, если на то пошло. Но я считаю, что мне нужно, когда я компилирую свой проект Racket, чтобы иметь возможность raco exe
(?) Статически связать libsnappy
, который находится в моей системе, и свернуть все в один двоичный файл без каких-либо зависимостей.
Итак, мой вопрос: возможно ли это? Если да, то является ли он простым (то есть управляется с помощью инструментов raco)?
Я предполагаю, что в худшем случае мне придется загрузить все зависимости и собрать их из исходного кода, а также собрать мой проект Racket в виде библиотеки, а затем иметь какой-то каркасный проект C, который объединяет их все в одну вещь. Надеюсь нет.
Я также добавлю ... если это проще в других схемах (курица? Chez? Gambit? Guile?), тогда мне тоже было бы интересно узнать.
Обновление: я нашел эту статью с некоторыми анекдотами годовой давности о том, как кто-то пытался сделать то же самое https://taoofmac.com/space/blog/2019/06/20/2310
Исходя из этого и ответа Райана ниже, raco distribute
выглядит многообещающе, и мне действительно нужно попробовать это на себе, чтобы убедиться, что это работает.
Обновите еще раз: Вот еще одна статья, в которой снова подтверждается, что raco distribute
следует помещать все в папку без внешних операций https://defn.io/2020/06/28/racket-deployment/ и вот указатель на документы о том, как создать образ .dmg для MacOS: https://docs.racket-lang.org/raco/exe-dist.html#(part._.API_for_.Bundling_.Distributions)
chez-exe
не делает то, что я хочу github.com/gwatt/chez-exe/issues /2а> - person Anentropic   schedule 20.07.2020raco distribute
создает версию исполняемого файла (который вы создали с помощьюraco exe
), который находится в структуре каталогов, где рядом с ним находятся все общие библиотеки racket. Я думаю, что для сторонних общих библиотек вам нужно поместить их в разумное место и соответствующим образом настроить пути, используяconfig.rktd
во время сборки. Если вам действительно нужны статические двоичные файлы, я понятия не имею, но я подозреваю, что это вообще невозможно в OSX. - person   schedule 20.07.2020.dylib
или.so
как относительный path и сделать их частью распространяемого пакета? - person Anentropic   schedule 20.07.2020raco exe
теперь создает двоичный файл, который не нуждается ни в каких библиотеках Racket во время выполнения, поэтому я больше не могу сказать). Для сторонних общих библиотек я не уверен, но я ожидаю этого, если вы будете осторожны. - person   schedule 20.07.2020