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

Can't load any egg when embedding Chicken Scheme library into C project

我正在开发一个在 C 项目中使用的 chicken 库。当我尝试加载 egg 时(例如 (use intarweb)),运行时会抱怨无法加载 egg。

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

    Call history:

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

我想知道是不是runtime没有定位egg的安装位置,所以我尝试设置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

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

如果你真的想 link 静态地在 intarweb 中,你必须静态地编译它和它的所有依赖项(大多数 CHICKEN 4 eggs 目前没有在他们的安装文件中做,所以你必须手动完成)和 link 它们,并使用 (declare (uses intarweb)) (import intarweb) 而不仅仅是 (use intarweb)a tutorial 介绍了如何做到这一点。不幸的是,这有点涉及CHICKEN 4。

在 CHICKEN 5 中,chicken-install 已被重写以使其更容易支持鸡蛋的静态编译。如果你喜欢,你已经可以try out the latest release candidate。已经移植了很多egg(包括intarweb),应该可以稳定使用;我们希望这是最后一个候选版本。