Прежде всего, я не уверен, что вообще можно вызывать скомпилированные функции 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 .