如何用 C/C++ 开发组件
介绍
什么是组件?
Gambas 组件是用 C 或 C++ 编写的共享库,它们向 Gambas 解释器添加新功能。
它们的作用类似于 Linux 内核的 Linux 驱动程序:
-
组件和解释器通过 Gambas 编程接口进行通信。
-
它们必须在 Gambas 源码包内编译。
-
它们是在解释器环境中执行的,因此不能为所欲为。
一个组件可以包含:
-
添加到其他 Gambas 类的新类。这些类包含向解释器声明使用的每个方法、常量和事件描述的 C 结构。
-
解释器挂钩。这些是实现重要的解释器操作的特殊函数,例如管理事件循环、读取命令行参数......
-
一个可选的编程接口,可增强 Gambas 编程接口,并且其他组件可以使用。
组件必须有一个名称。该名称是一个单词gb,后跟一个以点分隔的单词列表,描述该组件及其依赖的另一个组件的角色(如果有)。
例子
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
。
如果您的组件需要一个或多个共享库,请使用第一种情况。
如果您的组件只需要解释器已经使用的非常基本的库(例如或
libc
或
libm
) ,请使用另一种。
典型的组件目录包括:
-
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
文件了解更多详细信息。