2017-02-11 5 views
0

На the official website of gobject, мы можем прочитать:Каким образом gobject облегчает привязку?

GObject, и его тип системы более низкого уровня, GType, используются GTK + и большинством библиотек GNOME, чтобы обеспечить:

  • объектно-ориентированный C-основе API-интерфейсы и
  • автоматических привязок прозрачна API к другим собранным или интерпретируемых языков

Первая часть кажется мне понятной, но не второй.

Действительно, когда речь идет о gobject и binding, введенная концепция часто является gobject-intropspection, но насколько я понимаю, gobject-introspection может использоваться для создания .gir и .typelib для любой документированной библиотеки C, а не только для библиотеки на основе объектов.

Поэтому я задаюсь вопросом, что делает gobject особенно подходящим.

ответ

2

Насколько я понимаю, gobject-introspection можно использовать для создания .gir и .typelib для любой документированной библиотеки C, а не только для библиотеки на основе объектов.

Это неправда на практике. Вы можете сделать некоторые очень простые вещи, но вам нужно написать GIR вручную (вместо того, чтобы просто запускать программу, которая сканирует исходный код). Единственные, о которых я знаю, - это those distributed with gobject-introspection (файлы * .gir, файлы * .c есть во избежание циклических зависимостей), и даже те, которые обычно являются лишь небольшим подмножеством C API.

Что касается других функций, почти все в GObject помогает ... Основная идея состоит в том, что привязки часто нуждаются в RTTI. Существуют такие типы, как GValue (простой ящик для хранения информации о значении + тип), GClosure (для обратных вызовов), свойства и сигналы описывают себя GType s, и т. Д.. Если вы используете GObjects (вместо создания нового фундаментального типа), вы получаете данные о времени наследования и интерфейсы во время выполнения, а нечетная схема построения GObject позволяет другим типам подкласса, указанным в C.

Причина: g-ir-scanner не может действительно много делают для библиотек, отличных от GObject, что все эти сведения отсутствуют. После сканирования исходного кода, ищущего аннотации, g-ir-scanner фактически загрузит скомпилированный модуль и использует API GObject для захвата этой информации (что делает кросс-компиляцию болезненным). Другими словами, GObject-Introspection - это гораздо меньший проект, чем вы думаете ... огромный процент необходимых ему данных получает от GObject API.

+0

Спасибо, я не знал, что 'g-ir-scanner' использовал GObject таким образом. Что касается RTTI, это действительно полезно для не интерпретируемого языка? Он успешно используется в PyGObject, например, но имеет ли он смысл на компилированном языке? – eponier

+1

Это имеет смысл, если вы/интерпретируете/динамически набираете /. Но ответ - да; это определенно * больше * полезно, когда у вас нет информации о статическом типе, но на C есть много случаев, где вы можете многократно переписывать один и тот же код, используя что-то вроде GValue или добавляя параметр GType. – nemequ

+0

Не могли бы вы привести пример, иллюстрирующий ваше последнее предложение, пожалуйста? – eponier

Смежные вопросы