Ошибка компиляции glpkerl (библиотека glpk erlang)
Я пытаюсь скомпилировать библиотеку glpkerl в Ubuntu 11.10, но пока безуспешно.
Поскольку я все время получаю ошибки, может быть, я упускаю что-то важное:
Что я пробовал
Моя установленная версия Erlang - R14B02 (устанавливается через официальный репозиторий apt моего дистрибутива).
Поскольку моя версия glpk новее в официальном репозитории, я скачал glpk-4.38 отсюда: http://ftp.gnu.org/gnu/glpk/. Я не хочу устанавливать эту версию glpk в масштабе всей системы, поэтому я создаю каталог ~/opt и использую его в следующих шагах в качестве корня для всех устанавливаемых библиотек.
export MY_PREFIX=$HOME/opt
mkdir $MY_PREFIX
cd /tmp
curl http://ftp.gnu.org/gnu/glpk/glpk-4.38.tar.gz | tar zx
cd glpk-3.48 && ./configure --prefix=$MY_PREFIX && make -s && make -s install
Затем я загружаю glpkerldrv и пытаюсь установить его:
cd /tmp
curl http://glpkerl.googlecode.com/files/glpkerldrv-4.38.0.tar.gz | tar xz
cd glpkerldrv-4.38.0
./configure --prefix=$MY_PREFIX LDFLAGS="-L$MY_PREFIX/lib" CPPFLAGS="-I$MY_PREFIX/include"
make -s
Видимо что-то пошло не так при использовании make. Я отключил преобразование предупреждений компилятора в ошибки, используя --disable-hardcore во время настройки, как указано в вики-установке glpkerl. Но даже тогда остается следующая необъявленная ошибка идентификатора:
handlers.c: In function decode_from:
handlers.c:3310:29: error: INT_MAX undeclared (first use in this function)
handlers.c:3310:29: note: each undeclared identifier is reported only once for each function it appears in
Очевидно, что perl-скрипт, который генерирует файл handlers.c, должен также включать limit.h. Я исправил это, добавив следующее (у меня нет опыта работы с C, поэтому я не уверен, что это правильный способ сделать это):
--- a/src/make-handlers
+++ b/src/make-handlers
@@ -52,6 +52,10 @@
my ($name, $values) = @_;
print <<EOD;
+#include <limits.h>
+EOD
+
+ print <<EOD;
#define deserialize_$name(buf, buflen) \\
({ \\
uint8_t byte; \\
Сейчас строительные работы (с --disable-hardcore
, хотя я не думаю, что предупреждения следует игнорировать, см. прикрепленный файл), и я могу выполнить make, make check и make install, что я и сделал.
Я застрял во второй части, хотя:
cd /tmp
curl http://glpkerl.googlecode.com/files/glpkerl-4.38.0.tar.gz | tar xz
cd glpkerl-4.38.0/
./configure --prefix=$MY_PREFIX LDFLAGS="-L$MY_PREFIX/lib" CPPFLAGS="-I$MY_PREFIX/include"
PKG_CONFIG_PATH=$MY_PREFIX/lib/pkgconfig make -s
PKG_CONFIG_PATH=$MY_PREFIX/lib/pkgconfig make -s check
в то время как сборка выглядит нормально, проверка завершается неудачно из-за ошибки диализатора:
dialyzer: Could not find the PLT: /home/my_user/.dialyzer_plt
По-видимому, мы можем передать DIALYZERFLAGS в make-файл, что я и сделал:
DIALYZERFLAGS="--build_plt" PKG_CONFIG_PATH=$MY_PREFIX/lib/pkgconfig make -s check
и вот где я не уверен, как поступить
после выполнения последней команды я получаю следующую ошибку:
dialyzer: {dialyzer_error,"Byte code compiled with debug_info is needed to build the PLT"}
Странно то, что параметр +debug_info передается компилятору erlang, как показано в файле Makefile.opt.
Я прекратил расследование дальше, потому что я не уверен, как я могу решить это вообще в моей нынешней среде; я что-то упускаю здесь очевидное? Спасибо!
(теги: erlang glpk glpkerl)
1 ответ
Проблема здесь может заключаться в том, что вы используете Dialyzer для неправильного анализа: dialyzer используется для анализа стандартных библиотек, на которых строится ваше приложение, в дополнение к вашим модулям (которые вы должны ссылаться с абсолютным именем).
Таким образом, в идеальной среде вы должны напечатать что-то вроде dialyzer --build_plt --apps erts kernel stdlib
создать таблицу постоянного поиска в первый раз, а затем вы можете добавить свои приложения в файл PLT dyalizer, используя dialyzer --add_to_plt
,
Кстати, если вы используете dyalizer напрямую с вашими модулями, вы должны предоставить скомпилированный файл.beam, а не исходный файл.erl.