この第 1 版は Lua 5.0 に向けに執筆されました。後続のバージョンでもほとんどが関連していますが、いくつか相違点があります。
第 4 版は Lua 5.3 を対象としており、Amazon やその他の書店で購入できます。
この本を購入することで、Lua プロジェクトを支援することもできます。
![]() |
プログラミング inLua | ![]() |
第 1 部 言語 第 8 章 コンパイル、実行、エラー |
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から直接に呼び出すことができます。ライブラリの読み込みや初期化関数の検索中にエラーが発生した場合は、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ライブラリを開くことができます。
著作権 © 2003–2004 Roberto Ierusalimschy。すべての権利が予約されています。 | ![]() |