我一直在寻找有关此方面的信息,但没有发现任何有用的信息。
背景
我所安装的是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/