我已经找到了一些相关的信息,但没有发现任何有用的信息。
背景的
我所拥有的是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库包含在程序中?
答案 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也可用。