我一直在寻找有关此方面的信息,但没有发现任何有用的信息。

背景

我所安装的是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,则可以为其公共(public)功能创建简单的套接字接口(interface),并使用任意语言调用它们。

尽管使用网桥非常灵活,但并不是很方便。将Common Lisp嵌入C++程序的另一种方法是...使用 Embedded Common Lisp 。它是专门为您的目的而设计的。您可以在其manual页面上找到嵌入规则。

最后,您可以对平台使用Common Lisp实现,该平台已经支持与C++代码集成。如果仅在Windows中工作,则必须轻松将应用程序集成到CL implementations for CLR之一上。如果您要使用Linux,也可以使用implementations for JVM

关于c++ - 是否可以在Windows上将我的GCL Lisp文件与单独的C++程序链接在一起?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7114797/

10-13 07:30
查看更多