SWIG
Генератор обёрток над C/C++ библиотеками для других (в основном скриптовых) языков.
Обычно генерирует 2 файла:
- C/C++ - файл для компилирования в качестве модуля целевого языка
- Файл на целевом языке - в качестве обёрток и более удобного доступа с C/C++-обёртками.
SWIG только генерирует файлы, но не занимается их конечной компиляцией, это нужно делать С/С++-компилятором.
В простых случаях может обрабатывать заголовочные файлы "как есть". Но обычно требуется дублировать описание интерфейса с поясняющими директивами как понимать тот или иной тип/параметры и т.п., чтобы правильно генерировать обёртки над ними в целевом языке.
В качестве целевых языков поддерживаются: Python, PHP, Java и прочие.
Важное замечание
SWIG временами неожиданно обрабатывает переходы между языками, например все структуры или неизвестные типы он обрабатывает только как указатели и не лезет внутрь.
Если C-функция принимает или возвращает структуры по значению - для неё генерируется обёртка с приёмом/возвратом стуктур/типов по указателю. Это может потребовать доп. менеджмента памяти со стороны целевого языка.
Имеет смысл почитать Basic-раздел документации.
Заметки
Отдельный интерфейсный файл
С одной стороны SWIG располагает качественным парсером определений C/C++-кода и может обрабатывать неподготовленные заголовочные файлы, с другой - авторы рекомендуют делать отдельный интерфейсный файл.
- часто значительную часть функций можно не импортировать - это упрощает код.
- можно лучше структурировать интерфейс и он будет проще/понятнее
- для больших проектов это упрощает поддержку за счёт того что поддерживается только то, что нужно.
Можно включать заголовочный файл прямо в проект
В биндинге к небольшим проектам или проектам, откуда нужно импортировать всё - можно просто включить заголовочный файл с директивами.
/* File : interface.i */
%module mymodule
%{
#include "header.h" # Эта строка будет включена в сгенерированный код и нужна чтобы код потом мог скопилироваться
%}
%include "header.h" # Эта строка включает заголовочный файл для разбора в качестве директив
C-структуры можно расширять методами
SWIG позволяет расширять C-структуры прикреплёнными функциями, чтобы представлять их как объекты с методами в целевом языке. документация