Skip to content

Latest commit

 

History

History
38 lines (27 loc) · 2.78 KB

bindings.md

File metadata and controls

38 lines (27 loc) · 2.78 KB

Написание binding'ов

Binding это код, позволяющий использовать существующий код на другом языке (библиотеку).

Для статической линковки необходимо объявить используемые типы данных и функции:

struct Foo { float x, y; }
extern(C) int somefunc(Foo*, int);

И добавить флаг линковки в сборочный скрипт (dub.sdl, dub.json или meson.build).

Для динамической линковки процесс чуть более объёмный и требует:

  • объявления типов
  • объявление указателей на функции
  • кода загрузки указателей из динамической библиотеки (платформозависимый)
  • реализации функций-обёрток, которые будут вызывать функции по указателям

Библиотека будет загружаться во время работы программы, флагов линковки и наличия самой библиотеки в скомпилированном виде на момент компиляции приложения не требуется.

Для больших библиотек это достаточно объёмная работа, для её упрощения существует несколько библиотек:

  • bindbc -- самая распостранённая, ранее автор работал над Derelict (библиотека со схожей функциональностью), bindbc является переосмыслением, поддерживает -betterC;
  • dynamic и ssll -- библиотеки со схожей с bindbc функциональностью, но имею возможность генерации кода на основе объявлений, по объёму ручной работы биндинг динамической библиотеки становится схож с биндингом статической.

Использование этих библиотек описано в их README.md.

Так же существуют проекты, позволяющие использовать C/С++ библиотеки прямо из D кода dpp (препроцессинг исходников и кодогенерация) и calypso (совмещение на уровне ast компилятора).