gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:56:26 25 4
gpt4 key购买 nike

我已经查找了一些这方面的信息,但没有找到任何有用的信息。

背景

我安装的是 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 具有完全不同的内存管理策略,因此完全不清楚如何一起使用它们。

克服任何此类差异的一种方法是使用 bridges - 可以从两种语言访问的任何资源,例如 socket 、管道等。例如,如果您有模块 my-lisp-module您可以为其公共(public)功能创建简单的套接字接口(interface),并使用您喜欢的任何语言调用它们。

虽然使用网桥非常灵活,但不是很方便。将 Common Lisp 嵌入 C++ 程序的另一种方法是...使用 Embedded Common Lisp 。它是专为像您这样的目的而设计的。你可以在他们的 manual 上找到嵌入规则页。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com