第一版是為 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但有一些不同。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您還可以協助 支援 Lua 專案。
![]() |
程式設計 Lua | ![]() |
第一部分。語言 第 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
的單一函式中提供動態連結的所有功能。它有兩個字串引數:函式庫的完整路徑和初始化函式的名稱。因此,對它的典型呼叫看起來像下一個片段
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
通常,我們可以預期函式庫發行版會包含一個類似於先前程式碼片段的 stub 檔案。然後,若要安裝函式庫,我們將實際的二進位共用函式庫放在任何位置,編輯 stub 以反映真實路徑,然後在 LUA_PATH
中的目錄中新增 stub 檔案。有了這個設定,我們可以使用一般的 require
函數來開啟 C 函式庫。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |