1

我正在尝试在 Ubuntu 11.10 上编译 glpkerl 库,但到目前为止还没有成功。

由于我一直遇到错误,也许我缺少一些重要的东西:

我试过的

我安装的 Erlang 版本是 R14B02(通过我的发行版的官方 apt 存储库安装)。

由于我的 glpk 版本在官方 repo 中更新,我从这里下载了 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 时出了点问题。如 glpkerl install wiki 所述,我在配置期间使用 --disable-hardcore 禁用了编译器警告到错误的转换。但即便如此,以下未声明的标识符错误仍然存​​在:

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

显然,生成 handlers.c 文件的 perl 脚本也应该包含limits.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 传递给 makefile,我这样做了:

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 文件中所示。

我停止了进一步调查,因为我不确定如何在当前环境下解决这个问题;我在这里遗漏了一些明显的东西吗?谢谢!

(标签:二郎 glpk glpkerl)

4

1 回答 1

2

这里的问题可能是您使用 Dialyzer 进行错误的分析:除了您的模块(您必须使用绝对名称引用)之外,dialyzer 还用于分析您的应用程序构建的标准库。

因此,在理想的环境中,您应该dialyzer --build_plt --apps erts kernel stdlib第一次键入类似创建持久查找表的内容,然后您可以使用dialyzer --add_to_plt.

顺便说一句,如果您直接在模块中使用 dyalizer,则必须提供 .beam 编译文件,而不是 .erl 源文件。

于 2012-05-22T14:38:55.950 回答