如何用 C/C++ 开发组件

介绍

什么是组件?

Gambas 组件是用 C 或 C++ 编写的共享库,它们向 Gambas 解释器添加新功能。

它们的作用类似于 Linux 内核的 Linux 驱动程序:

  • 组件和解释器通过 Gambas 编程接口进行通信。

  • 它们必须在 Gambas 源码包内编译。

  • 它们是在解释器环境中执行的,因此不能为所欲为。

一个组件可以包含:

  • 添加到其他 Gambas 类的新类。这些类包含向解释器声明使用的每个方法、常量和事件描述的 C 结构。

  • 解释器挂钩。这些是实现重要的解释器操作的特殊函数,例如管理事件循环、读取命令行参数......

  • 一个可选的编程接口,可增强 Gambas 编程接口,并且其他组件可以使用。

组件必须有一个名称。该名称是一个单词gb,后跟一个以点分隔的单词列表,描述该组件及其依赖的另一个组件的角色(如果有)。

例子

  • gb.qt4 是一个基于Qt4的组件,为Gambas带来了GUI编程。

  • gb.net.curl 是一个基于libcurl库的组件。它需要 gb.net 组件,即加载第一个组件意味着加载第二个组件。

Gambas 编程接口

Gambas 编程接口是一组实用程序、函数和宏,允许您:

  • 描述该组件。

  • 定义解释器挂钩。

  • 分配和释放内存。

  • 操作数组、哈希表...

  • 操作 Gambas 原生数据类型。

  • 创建 Gambas 数组和集合。

  • 引发事件。

  • 操纵 Gambas 对象。

  • 从项目存档中加载文件。

  • 加载其他组件。

  • ...

强烈建议使用此编程接口,因为它可以防止组件执行奇怪的操作。

Gambas 编程接口是一种 C 结构,其中包含接口的每个函数的函数指针。

该结构在组件的主文件中声明,并由解释器在组件加载时自动初始化。

编写好的组件

编写好的组件是困难的部分!假设您想要编写一个 SDL 组件,即让 Gambas 项目使用 SDL 库的所有功能的组件:图形、声音、CD-ROM...

您只需包装库函数、结构和常量就可以了。 这是一种简单的方法,甚至不需要在所有情况下都用 Gambas 包装 C 结构和函数。

您的组件将会很有用,但对于 Gambas 程序员来说并不是很有趣,因为他必须使用 C 或 C++ 风格进行编程。

相反,你应该绞尽脑汁在 Gambas 和库之间创建一个不同的接口,尝试概括和简化库的原始接口。

这就是我对 gb.gui 所做的:使用 gb.qt4 组件比直接对 Qt 库进行编程要容易得多。此外,gb.gtk 组件使用与 gb.qt4 相同的接口,因此您可以无差别地使用其中之一来编写一个 GUI 程序。

组件的源文件组织

组件的源文件存储在其自己的目录中。

  • 要么位于项目根目录中,与组件同名 (gb.xxxx)。

  • 要么在子目录中 /main/lib

如果您的组件需要一个或多个共享库,请使用第一种情况。

如果您的组件只需要解释器已经使用的非常基本的库(例如或 libclibm ) ,请使用另一种。

典型的组件目录包括:
  • autoconf/automake 的内容,即描述如何编译组件的 Makefile.am 文件。

  • 组件中实现的每个主类都有一个源文件和一个头文件。

  • 一个实现组件入口点的主文件。

  • 一个组件描述文件。

一个 Gambas 项目如果组件有 Gambas 部分组件,则项目名称必须与组件名称相同。

以下是由 autoconf/automake 工具生成的 gb.dbus 目录的内容:

gb.dbus
├── acinclude.m4 -> ../acinclude.m4                         Common autoconf macros
├── AUTHORS                                                 File required by GNU tools
├── ChangeLog                                               File required by GNU tools
├── component.am -> ../component.am                         Makefile.am part needed by components
├── configure.ac                                            The autoconf configuration file
├── gambas.h -> ../main/share/gambas.h                      The Gambas interpreter API header
├── gb_common.h -> ../main/share/gb_common.h                Some other useful common declarations
├── INSTALL -> ../INSTALL                                   File required by GNU tools
├── m4 -> ../m4                                             Directory including common m4 macros used by configure.ac and acinclude.m4
├── Makefile.am                                             The top-level automake configuration file
├── missing -> ../missing                                   File required by GNU tools
├── NEWS                                                    File required by GNU tools
├── README                                                  README file
├── reconf -> ../reconf                                     Link at a script that reconfigure the source package from scratch
└── src                                                     The source directory
    ├── c_dbus.c
    ├── c_dbusconnection.c
    ├── c_dbusconnection.h
    ├── c_dbus.h
    ├── c_dbusobserver.c
    ├── c_dbusobserver.h
    ├── c_dbusvariant.c
    ├── c_dbusvariant.h
    ├── dbus_print_message.c
    ├── dbus_print_message.h
    ├── gb.dbus                                             The Gambas part of the gb.dbus component
    │   ├── .project
    │   └── .src
    │       ├── CTest2.class
    │       ├── CTest.class
    │       ├── DBusApplication.class
    │       ├── DBus.class
    │       ├── DBusObject.class
    │       ├── DBusProxy.class
    │       ├── DBusSignal.class
    │       └── MMain.module
    ├── gb.dbus.component                                    The component description file
    ├── helper.c
    ├── helper.h
    ├── main.c
    ├── main.h
    └── Makefile.am                                          The automake configuration file of the "src" sub-directory

TEMPLATE 目录源代码中有一个其中包含名为 make-component 的脚本,该脚本可以从配置文件创建组件骨架目录。

配置文件必须位于 TEMPLATE/conf 子目录中。

请参阅该 TEMPLATE/README 文件了解更多详细信息。