Как статически связать программу Chicken Scheme, которая использует расширения?

Мне нужно скомпилировать и статически скомпоновать программу Chicken. Я ожидаю использовать много расширений, особенно http-client.

Я могу скомпилировать исходный код с помощью следующей команды:

csc -compile-syntax -static linux-setup.scm

or

csc -R http-client -compile-syntax -static linux-setup.scm

Но когда я запускаю его, я получаю следующую ошибку:

Error: (require) cannot load extension: http-client

    Call history:

    ##sys#require           <--

Я также пробовал (declare (uses http-client)) в источнике, но безуспешно:

linux-setup.o: In function `f_369':
/mnt/data/Documents/Programming/chicken-scheme/linux-setup/linux-setup.c:219:
 undefined reference to `C_http_2dclient_toplevel'
collect2: error: ld returned 1 exit status

Error: shell command terminated with non-zero exit status 256: 'gcc' 'linux-setup.o'
 -o 'linux-setup' -L"/usr/lib"  -Wl,-R"/usr/lib" -static '/usr/lib/libchicken.a' -lm -ldl

Статическая ссылка — это то, что мне нужно. Это не проблема XY. Мне нужно, чтобы мои исполняемые файлы запускались в только что установленной системе Linux без каких-либо зависимостей. Это основная причина, по которой я перешел с Common Lisp на Scheme.

Что я делаю не так, пожалуйста?


person Sod Almighty    schedule 13.08.2016    source источник


Ответы (1)


Предполагая, что ваша программа находится в файле a-program.scm:

csc -deploy a-program.scm
cd a-program/
chicken-install -deploy -p $PWD http-client

...и вуаля!

изменить: оказывается, что правильный ответ на опубликованную проблему решен в этом документе: http://www.foldling.org/scheme.html#compiling-statically-linked-куриныесхемы-программы-с-расширениями

person dercz    schedule 13.08.2016
comment
Что ж, это полезно знать... и технически он будет работать на новой установке Linux... но это не ответ на мой вопрос, как мне получить все в одном исполняемом файле? После запуска chicken-install в $PWD есть сто девяносто файлов. То есть, я чувствую, немного чрезмерно. - person Sod Almighty; 13.08.2016
comment
Я не хочу показаться злым, но вопрос заключался в том, что мне нужно, чтобы мои исполняемые файлы запускались в только что установленной системе Linux без каких-либо зависимостей. (...) Что я делаю не так, пожалуйста? ;) В любом случае, существует утомительный способ создать один автономный исполняемый файл, который может вам подойти: foldling.org/ — обратите внимание, что -deploy уже создал файлы .o в a-program/ — однако это может быть сложнее, чем просто csc -static a-program.o a-program/*.o -o aprog ... удачи! - person dercz; 13.08.2016
comment
ps, может быть, вы также можете попробовать gambit-c, это сработало для меня, но я не напортачил с пакетами, кроме matcher и irregex... - person dercz; 13.08.2016
comment
Спасибо, я проверю их. Но в моем вопросе, когда я говорил о статической компоновке, я как бы имел в виду все в одном исполняемом файле. По моему опыту, обычно именно это и означает этот термин. - person Sod Almighty; 13.08.2016
comment
Похоже, путь foldling.org — правильное решение. Если вы хотите сделать это ответом, я приму его. - person Sod Almighty; 13.08.2016
comment
Статическая привязка яиц — это одна из вещей, которую мы хотим улучшить в CHICKEN 5, облегчая выполнение правильных действий. Просить авторов яиц позаботиться об этом не очень хорошо, как мы заметили в CHICKEN 3; большинство авторов пренебрегали статическими версиями своих яиц, потому что так мало людей используют статическое связывание. Кроме того, обратите внимание, что Gambit-C, хотя и является отличной системой Scheme сама по себе, на самом деле не имеет имеет систему расширений, так что вопрос здесь довольно спорный. - person sjamaan; 15.08.2016