是否有一种方法将我的GCL Lisp文件与Windows上的单独c++程序链接

Is there a way to link my GCL Lisp file with a separate C++ program on Windows?

本文关键字:Windows 文件 单独 链接 程序 c++ Lisp GCL 一种 我的 方法      更新时间:2023-10-16

我已经找了一些关于这方面的信息,但没有发现任何非常有用的信息。

背景


我安装的是GNU Common Lisp。我可以创建一个Lisp文件,并使用以下命令将其编译为.o对象文件:

gcl -compile <my lisp filename>

一旦我有了。o文件,我使用命令(使用MinGW):

g++ -o myProgram.exe temp.o temp.cpp

我的Lisp文件在GCL中工作。我的temp.cpp文件是:

//function from (defun fib (x) ...) in lisp file
extern int fib(int);
#include <iostream>
int main()
{
    int val;
    std::cout << "Print Fibonacci numbers" << std::endl;
    std::cout << ">";
    std::cin >> val;
    while (val != -1)
    {
        std::cout << fib(val) << std::endl << std::endl;
        std::cout << ">";
        std::cin >> val;
    }
    return 0;
}
我在编译时得到的错误是:
temp.cpp:(.text+0x180): undefined reference to `fib(int)'
temp.o:temp.c:(.text+0xb): undefined reference to `vs_base'
temp.o:temp.c:(.text+0x17): undefined reference to `vs_limit'
temp.o:temp.c:(.text+0x1d): undefined reference to `vs_top'
temp.o:temp.c:(.text+0x2d): undefined reference to `small_fixnum_table'
...

错误很长,看起来像GCL中定义的所有函数。

我的问题

所以,最后我的问题。我想做的事情可能吗?如果我计划将其与c++程序链接,我是否需要以某种方式包括整个GCL库?

首先,我不确定是否可以从c++调用GCL编译的函数。比较CL和c++函数的定义:

(defun fib (x) ...)

int fib(int)

第二个函数是严格类型的,而第一个函数接受并返回任何对象。那么,g++应该在temp.o文件中搜索什么函数呢?即使在CL的函数中声明类型,编译后的函数是否与c++的函数具有相同的格式?即使是像c++和Delphi这样类似的语言,如果没有特殊的指令,也不能连接在一起,因为向函数堆栈传递参数的顺序不同。再深入一点,您可以看到c++和CL具有完全不同的内存管理策略,因此如何将它们一起使用完全不清楚。

克服这些差异的一种方法是使用桥接 -任何可以从两种语言访问的资源,例如套接字,管道等。例如,如果您有模块my-lisp-module,您可以为其公共函数创建简单的套接字接口,并从您喜欢的任何语言调用它们。

虽然使用桥梁非常灵活,但不是很方便。将Common Lisp嵌入c++程序的另一种方法是…使用嵌入式公共Lisp。它是专门为你这样的目的设计的。你可以在他们的手册页面上找到嵌入规则。

最后,您可以为平台使用Common Lisp实现,该平台已经支持与c++代码集成。如果您只在Windows中工作,那么将您的应用程序集成到CLR的一个CL实现上一定很容易。如果您打算迁移到Linux, JVM的实现也是可用的。