Есть ли способ связать мой файл GCL Lisp с отдельной программой C ++ в Windows? - PullRequest
2 голосов
/ 19 августа 2011

Я искал некоторую информацию по этому вопросу и не нашел ничего очень полезного.

Фон

У меня установлен 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.

Мой вопрос

Итак, наконец-то мой вопрос.Возможно ли то, что я пытаюсь сделать?Нужно ли каким-то образом включать всю библиотеку GCL в программу, если я планирую связать ее с программой на C ++?

1 Ответ

3 голосов
/ 19 августа 2011

Прежде всего, я не уверен, что вообще можно вызывать скомпилированные функции GCL из C ++. Сравните определения ваших функций 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 для CLR . Если вы собираетесь перейти на Linux, также доступны реализации для JVM .

...