この第 1 版は Lua 5.0 に向けに執筆されました。後続のバージョンでもほとんどが関連していますが、いくつか相違点があります。
第 4 版は Lua 5.3 を対象としており、Amazon やその他の書店で購入できます。
この本を購入することで、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と呼ばれる関数で提供しています。これは文字列引数を 2 つ持ちます。ライブラリの完全パスと初期化関数の名前です。したがって、標準的な呼び出しは次のフラグメントのようになります。

    local path = "/usr/local/lua/lib/libluasocket.so"
    local f = loadlib(path, "luaopen_socket")
loadlib関数は、指定されたライブラリを読み込み、Luaにリンクします。ただし、ライブラリはオープンしません(つまり、初期化関数を呼び出しません)。代わりに、初期化関数をLua関数として返却するため、Luaから直接に呼び出すことができます。ライブラリの読み込みや初期化関数の検索中にエラーが発生した場合は、loadlibnilとエラーメッセージを返します。エラーをチェックして初期化関数を呼び出すように、以前のフラグメントを改善できます。
    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ライブラリを開くことができます。