第一版是针对 Lua 5.0 编写的。虽然在很大程度上仍然适用于更高版本,但还是存在一些差异。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助 支持 Lua 项目


8.2 – C 程序包

由于 Lua 可以轻松与 C 互连,因此也可以用 C 为 Lua 编写程序包。但是,与用 Lua 编写的程序包不同,C 程序包在使用前需要加载并与应用程序链接。在大多数流行系统中,最简单的方法是使用动态链接功能。但是,此功能不属于 ANSI C 规范;也就是说,没有可移植的方法来实现它。

通常,Lua 不包含任何无法在 ANSI C 中实现的功能。但是,动态链接有所不同。我们可以将其视为所有其他功能的母体:一旦拥有它,我们就可以动态加载 Lua 中不存在的任何其他功能。因此,在这种特殊情况下,Lua 打破了其兼容性规则,并使用条件代码为多个平台实现了动态链接功能。标准实现为 Windows(DLL)、Linux、FreeBSD、Solaris 和一些其他 Unix 实现提供了此支持。将此功能扩展到其他平台应该不难;检查您的发行版。(要检查它,请从 Lua 提示符运行 print(loadlib()) 并查看结果。如果它抱怨参数错误,则您具有动态链接功能。否则,错误消息表明此功能不受支持或未安装。)

Lua 在一个名为 loadlib 的函数中提供了动态链接的所有功能。它有两个字符串参数:库的完整路径和初始化函数的名称。因此,对其的典型调用看起来像下一个片段

    local path = "/usr/local/lua/lib/libluasocket.so"
    local f = loadlib(path, "luaopen_socket")
loadlib 函数加载给定的库并将其链接到 Lua。但是,它不会打开库(即,它不会调用初始化函数);相反,它将初始化函数作为 Lua 函数返回,以便我们可以直接从 Lua 调用它。如果加载库或查找初始化函数时出现任何错误,loadlib 将返回 nil 和一条错误消息。我们可以改进之前的片段,以便它检查错误并调用初始化函数
    local path = "/usr/local/lua/lib/libluasocket.so"
    -- or path = "C:\\windows\\luasocket.dll"
    local f = assert(loadlib(path, "luaopen_socket"))
    f()  -- actually open the library

通常,我们可以期望库发行版包含类似于之前代码片段的存根文件。然后,要安装库,我们将实际的二进制共享库放在任何位置,编辑存根以反映真实路径,然后在 LUA_PATH 中的目录中添加存根文件。使用此设置,我们可以使用常规 require 函数来打开 C 库。