1

我想将 ECL 程序编译成独立的、可移植的可执行文件。但无论我尝试什么,它仍然需要加载“asdf”才能工作。

这部分是 AB 问题,因为我想删除 ASDF 依赖项,因为当使用 valgrind 运行时,无论我等待多长时间,我的程序都无法加载 ASDF。但我还想在将来制作一个独立的可执行文件以便于部署,因此需要解决 A 和 B 问题。

什么有效

目前,我通过构建静态库并将它们全部加载到 C 程序中来编译程序。最后一个库定义了一个主函数,我调用它来进入进程。

#include <ecl/ecl.h>

extern void init_alexandria(cl_object);
extern void init_float_features(cl_object);
extern void init_cl_opengl(cl_object);
extern void init_sdl2(cl_object);
extern void init_mypackage(cl_object);

int ecl_init_modules() {
  ecl_init_module(NULL, init_alexandria);
  ecl_init_module(NULL, init_float_features);
  ecl_init_module(NULL, init_cl_opengl);
  ecl_init_module(NULL, init_sdl2);
  ecl_init_module(NULL, init_mypackage);

  return 0;
}


int main (int argc, char **argv) {
  
  cl_boot(argc, argv);

  ecl_init_modules();
    
  cl_eval(c_string_to_object("(mypackage::main)"));

  cl_shutdown();
  return 0;
}

使用 asdf:make-build 构建库

(asdf:make-build :sdl2
                 :type :static-library
                 :monolithic t
                 :move-here #P"./dist/"
                 :prologue-code '(require :asdf)
                 :init-name "init_sdl2")

(asdf:make-build :alexandria
                 :type :static-library
                 :move-here #P"./dist/"
                 :init-name "init_alexandia")

(asdf:make-build :float-features
                 :type :static-library
                 :move-here #P"./dist/"
                 :init-name "init_float_features")

(asdf:make-build :cl-opengl
                 :type :static-library
                 :move-here #P"./dist/"
                 :init-name "init_cl_opengl")

(asdf:make-build :mypackage
                 :type :static-library
                 :move-here #P"./dist/"
                 :init-name "init_mypackage")

最后我可以使用 gcc 构建和执行。

gcc main.c dist/*.a -o mypackage -lecl

然后当我运行我的程序时,它按照说明包含 asdf.fas,但至少可以正常运行。

;;; Loading #P"/usr/lib/ecl-21.2.1/ecl-quicklisp.fas"
;;; Loading #P"/usr/lib/ecl-21.2.1/ecl-curl.fas"
;;; Loading #P"/usr/lib/ecl-21.2.1/sockets.fas"
;;; Loading "/home/infinite_users/quicklisp/setup.lisp"
;;; Loading #P"/usr/lib/ecl-21.2.1/asdf.fas"
Using SDL Library Version: 2.0.10
Setting up window/gl.

我想要的是

我想删除 ASDF 依赖项,为此我需要从我的源代码中删除所有“要求”。这意味着:prologue-code '(require :asdf)从“sdl2”的构建声明中删除。

这样做会导致“缺少包”问题,可以通过将其依赖项构建为静态库并加载到程序中来解决。但是,当我尝试满足依赖于“UIOP”的“CFFI”的依赖时,我遇到了障碍。该程序不会加载任何东西,就像我想要的那样,但是一旦启动就会抛出错误。

Condition of type: SIMPLE-ERROR
The packages
  ((UIOP/OS . #<UIOP/OS package>) (UIOP/PATHNAME . #<UIOP/PATHNAME package>))
were referenced in compiled file
  NIL
but have not been created

这是一个问题,因为我无法将 UIOP 或 ASDF 构建为库。asdf:make-build返回 (NIL) 并且不表示任何其他错误。我尝试编译正在加载的“fas”文件并将它们加载到我的“main.c”源文件中,但 ECL 似乎没有这种功能。我该如何从这里开始?

4

0 回答 0