为什么我不能在Ubuntu 12.04的Prolog中加载这段C代码,但我可以在OS X中加载
我试图理解如何将C代码与SWI Prolog链接,但我遇到了一些困难。当我编译并加载下面的代码时,它在OSX上运行得非常好,但是当我将完全相同的代码移到Ubuntu12.04上时,它就不工作了。我得到了错误为什么我不能在Ubuntu 12.04的Prolog中加载这段C代码,但我可以在OS X中加载,prolog,swi-prolog,ffi,Prolog,Swi Prolog,Ffi,我试图理解如何将C代码与SWI Prolog链接,但我遇到了一些困难。当我编译并加载下面的代码时,它在OSX上运行得非常好,但是当我将完全相同的代码移到Ubuntu12.04上时,它就不工作了。我得到了错误 ERROR: Exported procedure choose:choose/3 is not defined 当然还有。我不能再呼叫选择。当我尝试在一台全新的虚拟机上安装它时,它确实适用于SWI Prolog 5.10.4,但当我升级到新版本时,它再次失败。如果我使用5.10.4编译时
ERROR: Exported procedure choose:choose/3 is not defined
当然还有。我不能再呼叫选择。当我尝试在一台全新的虚拟机上安装它时,它确实适用于SWI Prolog 5.10.4,但当我升级到新版本时,它再次失败。如果我使用5.10.4编译时的旧.so文件,它仍然有效。但是,我无法使用swipl-ld编译并链接新的.so文件与新版本的SWI-Prolog
我做错了什么
二项式
:- module(binomial, [choose/3]).
:- use_foreign_library(choose).
选择
#include <gmp.h>
#include <SWI-Prolog.h>
static foreign_t
pl_choose(term_t size, term_t take, term_t result)
{
mpz_t rop;
mpz_t n;
unsigned long int k;
int rc;
mpz_init(rop);
mpz_init(n);
if ( PL_get_mpz(take, rop) && PL_get_mpz(size, n) )
{
k = mpz_get_ui(rop);
mpz_bin_ui(rop, n, k);
rc = PL_unify_mpz(result, rop);
}
else
{
rc = FALSE;
}
mpz_clear(rop);
mpz_clear(n);
return rc;
}
install_t
install_choose()
{
PL_register_foreign("choose", 3, pl_choose, 0);
}
闻起来很像这个
建议更新您的问题,添加linux版本。。可能对swi的人有用。闻起来很像这样
建议更新您的问题,添加linux版本。。可能对swi的人有用。闻起来很像这样
建议更新您的问题,添加linux版本。。可能对swi的人有用。闻起来很像这样
建议更新您的问题,添加linux版本。。可能对swi的同事有用。问题是由于共享libswipl.so安装在/usr/lib中,并且
/usr/lib/swi prolog/lib/arch中的静态libswipl.a,这会导致链接器选择
静态版本。临时解决方法是从/usr/lib/swi-prolog/lib/中删除libswipl.a
未来的版本将在/usr/lib中安装libswipl.a,因此您也可以移动库,尽管这样做
如果升级到下一版本,可能会导致apt报告的冲突。问题是由于共享libswipl.so安装在/usr/lib中,并且
/usr/lib/swi prolog/lib/arch中的静态libswipl.a,这会导致链接器选择
静态版本。临时解决方法是从/usr/lib/swi-prolog/lib/中删除libswipl.a
未来的版本将在/usr/lib中安装libswipl.a,因此您也可以移动库,尽管这样做
如果升级到下一版本,可能会导致apt报告的冲突。问题是由于共享libswipl.so安装在/usr/lib中,并且
/usr/lib/swi prolog/lib/arch中的静态libswipl.a,这会导致链接器选择
静态版本。临时解决方法是从/usr/lib/swi-prolog/lib/中删除libswipl.a
未来的版本将在/usr/lib中安装libswipl.a,因此您也可以移动库,尽管这样做
如果升级到下一版本,可能会导致apt报告的冲突。问题是由于共享libswipl.so安装在/usr/lib中,并且
/usr/lib/swi prolog/lib/arch中的静态libswipl.a,这会导致链接器选择
静态版本。临时解决方法是从/usr/lib/swi-prolog/lib/中删除libswipl.a
未来的版本将在/usr/lib中安装libswipl.a,因此您也可以移动库,尽管这样做
如果升级到下一版本,可能会导致apt报告的冲突
swipl-ld -lgmp -shared -o choose choose.c