将Chicken Scheme库嵌入C项目时无法加载任何鸡蛋

时间:2018-10-31 14:10:55

标签: chicken-scheme

我正在研究在C项目中使用的鸡肉库。当我尝试加载鸡蛋时(例如(use intarweb)),运行时会抱怨无法加载鸡蛋。

(lldb) run
Error: (require) cannot load extension: intarweb

    Call history:

    bridge-connector.scm:6: ##sys#require       <--
Process 56172 exited with status = 70 (0x00000046)

我想知道运行时是否无法找到鸡蛋的安装位置,所以我尝试设置CHICKEN_INCLUDE_PATH环境变量没有成功:

export CHICKEN_INCLUDE_PATH="/usr/local/Cellar/chicken/4.13.0/lib/chicken/8/"

我什至尝试直接在完整路径中使用load

(load "/usr/local/Cellar/chicken/4.13.0/lib/chicken/8/intarweb.so")

但出现以下错误:

(lldb) run
Error: unbound variable: |\xcf\xfa\xed\xfe\x07\x00\x00\x01\x03\x00\x00\x00\x08\x00\x00\x00|

    Call history:

    bridge-connector.scm:6: load

我正在使用Chicken Scheme 4,并且正在初始化Chicken Scheme运行时,如下所示:

#include <chicken.h>

void my_lib_initialize()
{
  C_word k = CHICKEN_run(C_toplevel);
  (void)k;
}

我的Chicken库的构建如下:

csc -embedded -debug-info -d3 -J -c bridge-connector.scm
csc -embedded -debug-info -d3 -c my-lib.scm
csc -c my_lib_initialize.c
csc ./my_lib_initialize.o ./my-lib.o ./bridge-connector.o -shared -embedded -static -debug-info -d3 -o libmy-lib.dylib

1 个答案:

答案 0 :(得分:2)

如果要动态加载扩展名(-static就是这么做的),请不要使用use

如果您真的想静态链接intarweb,则必须静态编译它及其所有依赖项(大多数CHICKEN 4蛋当前不在其安装文件中执行,因此必须手动执行)并链接它们,并使用(declare (uses intarweb)) (import intarweb)而不是(use intarweb)。这是a tutorial的操作方法。不幸的是,这与“鸡4”有关。

在《鸡肉5》中,chicken-install已被重写,以使其更容易支持鸡蛋的静态编译。如果愿意,您可以try out the latest release candidate。已经移植了许多鸡蛋(包括intarweb),并且应该足够稳定以便使用。我们希望这是最新的候选版本。