Ошибка компиляции 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.

Другие вопросы по тегам