我正在尝试在Ubuntu 11.10上编译glpkerl库,但到目前为止还没有成功。
由于我一直都会遇到错误,也许有一些我不知道的重要事项:
我安装的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 install wiki中所述。但即便如此,仍然存在以下未声明的标识符错误:
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文件中所示。
我停止了进一步的调查,因为我不确定如何在我目前的环境下解决这个问题;我错过了一些明显的东西吗?谢谢!
(标签:erlang glpk glpkerl)
答案 0 :(得分:2)
这里的问题可能是你正在使用Dialyzer进行错误的分析:透析器用于分析应用程序构建的标准库以及模块(必须使用绝对名称引用)。
因此,在理想的环境中,您应该首先键入类似dialyzer --build_plt --apps erts kernel stdlib
的内容来创建持久查找表,然后使用dialyzer --add_to_plt
将您的应用程序添加到dyalizer PLT文件中。
顺便说一下,如果直接在模块中使用dyalizer,则必须提供.beam编译文件,而不是.erl源文件。