Как мне создать динамически связанный исполняемый файл в Racket? - PullRequest
5 голосов
/ 19 марта 2012

Я пытаюсь создать исполняемый файл в ракетке, который динамически связан. В настоящее время моя программа hello world компилируется в исполняемый файл размером 4 МБ. Вот оно:

#!/usr/bin/env racket  
#lang racket  

(define (extract str)  
  (substring str 4 7))  

(print (extract "the cat out of the bag"))  

Я скомпилирую, используя

raco exe first.rkt

И полученный исполняемый файл имеет размер 4+ МБ. Итак, очевидно, что он статически связывает рэкетные библиотеки.

- РЕДАКТИРОВАТЬ ---

Вот код запуска:

#lang racket

(require launcher/launcher)
(require racket/runtime-path)

(define-runtime-path prog-path "first.rkt")

(make-racket-launcher (list (path->string prog-path))
                      "first"
                      '())

Это просто нужно поместить в отдельный файл и выполнить с

 racket <launch-file>.rkt

Ответы [ 2 ]

7 голосов
/ 20 марта 2012

Вывод raco exe предназначен для статического включения необходимых модулей, поэтому он может быть не тем, что вы хотите. Вы смотрели на библиотеку launcher ? Он создаст исполняемый файл, который содержит только абсолютный минимум для запуска вашей программы при локальной установке.

В качестве альтернативы, выберите меньший язык, например #lang racket/base, который должен создавать меньшие исполняемые файлы, поскольку он не связан с таким количеством модулей.

Наконец, если вы работаете в Unix-системе, программа уже должна действовать как исполняемый файл, если был установлен ее исполняемый бит (x), поскольку вы уже добавили строку ракетки #!/usr/bin/env вверху. Это предполагает, что ваша ракетка находится в PATH. См. http://docs.racket -lang.org / guide / scripts.html

2 голосов
/ 19 марта 2012

Вы пробовали распространять raco?

Документация здесь: http://docs.racket -lang.org / Raco / ех-dist.html

...