有没有办法将我的GCL Lisp文件与Windows上的单独C ++程序链接?

时间:2011-08-18 22:14:28

标签: c++ lisp compilation

我已经找到了一些相关的信息,但没有发现任何有用的信息。

背景

我所拥有的是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库包含在程序中?

1 个答案:

答案 0 :(得分:3)

首先,我不确定是否可以从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 ++程序的另一种方法是......使用 Embedded Common Lisp 。它专为像您这样的目的而设计。您可以在manual页面上找到嵌入规则。

最后,您可以将Common Lisp实现用于平台,该平台已经支持与C ++代码的集成。如果您只在Windows中工作,则必须很容易将您的应用集成到CL implementations for CLR之一。如果您即将迁移到Linux,implementations for JVM也可用。