建置 Lua

lua-users home
wiki

以下記載一些在各種平台建置 Lua 的注意事項,包括連結到有用的建置套件。您可以在 LuaBinaries 找到提供已編譯 Lua 程式碼的網站連結。

有關詳細說明,也請參閱「Lua 程式設計入門」的 [第 1 章]

BuildingModules 說明如何為 Lua 建置 C 擴充模組。

將 Lua 嵌入 C++ 應用程式中的注意事項

請注意,Lua 是 ANSI C 的一個乾淨子集,可以編譯為 C 或 C++。Lua 標頭不包含 {#ifdef __cplusplus extern "C" {#endif ... Lua 標頭 ...#ifdef __cplusplus}#endif },因此只要變更檔案名稱,就可以透過將 lua 編譯成 C 或 C++,而不必變更任何檔案內容。

如果 lua 編譯成 C 函式庫(這是使用預先套件二進位檔的標準做法),為了將 Lua 嵌入 C++ 應用程式(例如,連結 C 到 C++),您必須將 extern "C" 放在 C++ 應用程式中包含 Lua 標頭的位置,例如:

extern "C" {
#include "lua.h"
}

如果您沒有這樣做,您可能會因為 C++ 名稱修飾而產生連結錯誤

請勿在郵件清單中抱怨這件事。:-) 請花時間在郵件清單中搜尋,因為這個話題已經被討論過很多次了。

可以這麼說,如果您正在散布函式庫的預先套件二進位檔,那麼您已經將 lua 核心編譯成 C(最有可能)或 C++,而且如果您將 lua 編譯成 C,您應該修改 lua 標頭來顯示這件事。然而,作者並不建議針對 lua 使用預先建置的函式庫,他們建議直接將 lua 原始程式碼納入您的應用程式。請參閱 BuildingModules 進行討論(頁面末端)。

預設情況下,如果 lua 5.1 或較新版本編譯成 C++,它會使用 C++ 例外來中止堆疊,而不是 longjmp/setjmp,不過這是可以設定的(在編譯期間)。請參閱 luaconf.h 附近的LUAI_THROW/LUAI_TRY 以進行討論。

對於 5.0,您可能必須聯絡 Alexey 以找到一個修補程式,使用 C++ 例外而不是 setjmp/longjmp,在頁面上找到他的電子郵件:' AlexeyVolynskov

(Unix)Autoconf

(Unix/Windows/OS X)CMake

在 OS X 中建置

請注意,從 lua 5.1.1 開始,當使用 LUA_USE_MACOSX 定義為建構時,會避免在 OS X 上使用 dlopen() 和其他 dlfcn API,這是因為過去沒有在沒有第三方(開源)dlcompat 函式庫的情況下支援 dlopen()。但是,從 OS X 10.3 開始提供 dlopen(),且從 OS X 10.4 開始,dlopen() 是動態載入函式庫的建議方式(至少是非 objective-c 程式碼)。這表示如果您不想設定目標為 OS X 10.3 以前的版本,OS X 特有的模組載入程式碼完全不必要。如果您定義 LUA_USE_DLOPEN,它會優先於 LUA_USE_DL_DYLD。

有關更多資訊,請參閱http://developer.apple.com/releasenotes/DeveloperTools/RN-dyld/index.html

(Windows/Unix)

Lua 建置[1]包含建置lualuac和函式庫的文件。它可以在下列平台上運作,包含所有必要的原始程式碼和建置檔。

如果您想要新增其他平台,請聯絡NickTrout。目前,只建置靜態連結版本的 Lua。

(Windows)Borland (bcc)

取得 src 和 src/lua 中的所有項,然後執行:-

bcc *.c -olua.exe

(Windows)Borland C++ 5.01 - Lua 5.0

必須在 Lua src 目錄中建立所有專案''1 Core.lib 和標準函式庫''為 Win32 ConsoleGUI建立靜態函式庫(用於 .dll)(.lib),而不具有程式庫的重要性。新增安裝檔案中提到的必要檔案。將 lua include 目錄新增到專案 include 目錄中。將編譯器設定為Pentium 程式碼字元資料對齊:然後,您就可以在 luser_number.h 中定義 USE_FASTROUND。編譯。

替代:Win32 ConsoleGUI建立動態函式庫(.dll),而不具有程式庫的重要性。新增安裝檔案中提到的必要檔案。透過定義來修改 lua.h 和 lualib.h 檔案:將 LUA_API 定義為 __declspec(dllexport) 和將 LUALIB_API 定義為 __declspec(dllexport)。將 lua include 目錄新增到專案 include 目錄中。將編譯器設定為Pentium 程式碼字元資料對齊:然後,您就可以在 luser_number.h 中定義 USE_FASTROUND。編譯。

註解:編譯器將抱怨並產生有關不存在結構(例如 lua_State)的警告。您可以安全地忽略它們。如果要使用 USE_POPEN,則需要將 popen 和 pclose 轉換為 _popen 和 _pclose。您可以定義 USE_TMPNAME 為 1。2 Lua 解譯器和編譯器Win32主控台建立一個 可執行檔(.exe)。包含在安裝檔案中提到的 核心標準程式庫,以及必要的檔案。將 lua include 目錄新增到專案 include 目錄。設定編譯器為 Pentium 程式碼和 字元資料比對。編譯。準備開始囉!

註解:如果您使用 Lua DLL 代替 LIB,切記在 lua.h 和 lualib.h 中將 LUA_API 定義為 __declspec(dllimport),並將 LUALIB_API 定義為 __declspec(dllimport)。

(Windows)Microsoft Visual Studio .Net 2003(版本 7.1)Lua 5.x Solution

簡單來說,它包含 Visual Studio Solution 及 3 個專案。一個專案用來將 Lua 5.x 建立為靜態 lib,一個專案用來測試 lib 是否正常運作,一個專案用來建立 luac。以下是詳細內容,[Read Me] 檔案在此 [Visual Studio .Net 2003(版本 7.1)Solution 和專案檔案]

(Windows)Microsoft Visual C++ 6(VC6)

註解:[Philippe Lhoste (PhiLho) 法文網站] 有提供檔案下載,我要更新 Lua 頁面以提供直接下載。

它可以針對 Lua 4.0.1 進行少許修改(此版本的特定專案也有提供)。

基本上,我在 Lua 樹的根目錄設定 .dsw 檔案(工作區),以及散佈在層級結構中的幾個 .dsp(專案),以產生程式庫檔案、DLL 或可執行檔。

進行編譯時,應該先編譯程式庫(相依性會負責這一點)。

製作 DLL 時,我必須建立 .def 檔案,但對於 Lua 4.0.1,我只使用了 make_def.lua 腳本(當然假設我已經有 Lua 二進位檔案 :-) )。

您不必建立 .def 檔案即可建立 DLL,只需將 LUA_API=__declspec(dllexport)LUALIB_API=__declspec(dllexport) 新增到 C 編譯器定義中,對我來說運作良好。 -- JaenSaul

是的,但當時 Lua 4.0 尚未提供這項功能,而且我從 4.0 專案衍生出 5.0 專案。另外,我喜歡 .def 檔案,它可以快速查看所有 API 函式... -- PhilippeLhoste

看起來有人針對這部分做出了規定(至少從 5.1 開始)使用 LUA_BUILD_AS_DLL 定義。 -- BobClown?

我也建立了某些資源檔,提供漂亮圖示和一些版本資訊。

(Windows) mingw-msys (Lua 5.1.1)

簡而言之

make mingw

但您取得的可執行 lua 不支援模組的動態載入。如果您想啟用此功能,應將目標「mingw」修改為

mingw:
	$(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \
	"AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \
	"MYCFLAGS='-DLUA_DL_DLL -DLUA_BUILD_AS_DLL'" "MYLIBS=" "MYLDFLAGS=-s" \
        lua.exe
	$(MAKE) "LUAC_T=luac.exe" luac.exe
在這裡,我們將「-DLUA_DL_DLL」加入 MYCFLAGS 變數。

對那些願意冒險(以額外的符號從 DLL 匯出,但非官方的 Lua API)的人而言,您可以將「mingw」目標變更為,並同時建置 lua.exe 和 luac.exe

mingw:
    $(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" "LUAC_T=luac.exe" \
    "AR=$(CC) -shared -Wl,--export-all-symbols -o" "RANLIB=strip --strip-unneeded" \
    "MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" all

請注意,官方 Lua 發佈版會建立並使用「lua51.dll」,而LuaBinaries 則發佈「lua5.1.dll」。兩者都使用名稱為「lua.exe」的應用程式,但該應用程式已連結至其中一個 DLL,這可能是安裝兩者時產生細微錯誤的來源(請參閱以下之「建立轉發 DLL」)。

為了正確安裝 Lua,開啟頂層 Makefile,並將

現在處理一些舊版本...

以下是組態 [13],以及已成功用於建置 Lua 5.0.2 的 Makefile [14] 範例。Lua 子目錄中的 Makefile 不需要任何變更。使用目標 dll(亦即「make dll」)來使用 lua.exe 和 luac.exe,同時使用 lua.dll 和 lualib.dll,建置所有內容。將 lua-5.0.2/bin 中的所有內容複製到 MSYS/local/bin,並將 liblualib.a 和 liblua.a 複製到 MSYS/local/lib。您可以透過將它們連結至 liblualib.a 和 liblua.a(-L /usr/local/lib -llua -llualib)來編譯動態載入程式庫。

以下是用於將 lua-5.1-work5 建置為一組 DLL 和一組應用程式的 Makefile 和 luaconf.h 範例 [15]。「make install」會將這些檔案置於 Mingw /usr/local 子目錄中。

(Windows) mingw-cygwin 1.5 (Lua 5.1.1)

提醒:以下內容適用於較舊版本的 Cygwin(1.5)。Cygwin 1.7 不再使用「-mno-cygwin」(某人:請更新此部分)。

很不幸的是,Lua 5.1.1 的 Makefile 沒有選項能讓我們在 Cygwin 所包含的 MinGW 版本中乾淨建置。

若要毫不費力地在 Windows 中使用 Cygwin 建置 Lua,而不修改 Makefile

make "CC=gcc -mno-cygwin" mingw

如果您還需要 luac.exe

make "CC=gcc -mno-cygwin" -C src LUAC_T=luac.exe luac.exe

這些命令會建立動態連結至 lua51.dll 的 lua.exe,並建立靜態連結至 lua 的 luac.exe。我們沒有動態連結 luac.exe 至 lua51.dll 的原因在於,luac.exe 使用 lua51.dll 未匯出的特定內部函式。更好的方法可能是從 lua51.dll [2] 匯出這些額外的符號,最好加入這些符號。

除了上述兩個命令外,修改 Lua Makefile 的步驟也很直觀。將以下內容加入 src/Makefile

mingw-cygwin:
	$(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \
	  "CC=gcc -mno-cygwin" \
	  "AR=gcc -mno-cygwin -shared -o" "RANLIB=strip --strip-unneeded" \
	  "MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" lua.exe && \
	$(MAKE) "LUAC_T=luac.exe" "CC=gcc -mno-cygwin" luac.exe

然後使用「make mingw-cygwin」建置。

要安裝,請在 make 指令中加入「TO\_LIB=lua51.dll」。例如:

make TO_LIB=lua51.dll local

(Windows) Cygwin

下列說明如何建立 Cygwin 版本的 Lua(也就是連結到 cygwin1.dll [*3])。如果要在 Cygwin 下建立 MinGW 版本,請見上說明。另可參閱 Cygwin Lua 套件 [3][4][5]

「make posix」將建立一個不支援共用函式庫或 readline 的 Cygwin Lua。

「make linux」將建立一個不支援共用函式庫但支援 readline 的 Cygwin Lua。[*1]

「make mingw」將建立一個支援共用函式庫的 Cygwin Lua,但是並未使用「-DLUA\_USE\_LINUX」,因此並非最佳的版本。

如要建立一個支援共用函式庫和 readline 的 Cygwin Lua,可以使用下列建立規則[*2]

cygwin:
	$(MAKE) "LUA_A=cyglua-5.1.dll" "LUA_T=lua.exe" \
	"AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \
	"MYCFLAGS=-DLUA_USE_LINUX -DLUA_BUILD_AS_DLL" \
	"MYLIBS=-lreadline -lhistory" "MYLDFLAGS=-s" lua.exe

上述方法對 Lua 5.2 也適用,只要變更 DLL 名稱即可。

cygwin:
	$(MAKE) "LUA_A=cyglua-5.2.dll" "LUA_T=lua.exe" \
	"AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \
	"MYCFLAGS=-DLUA_USE_LINUX -DLUA_BUILD_AS_DLL" \
	"MYLIBS=-lreadline -lhistory" "MYLDFLAGS=-s" lua.exe

注意:Cygwin 通常會在共用函式庫開頭加上「cyg」。Cygwin 中的 Lua 套件使用「cyglua-5.1.dll」,儘管你仍可以使用傳統的 Windows 名稱「lua51.dll」或「lua52.dll」。

Cygwin 與 Linux 不同,不需要「-lncurses」,儘管加了也沒有壞處。

LUA\_USE\_ULONGJMP 屬於 LUA\_POSIX 的一部分,而 LUA\_POSIX 又屬於 LUA\_USE\_LINUX 的一部分,曾經會導致 Cygwin 1.5 中發出一個無害的警告 [16]。在 Cygwin 1.7 中,這不再會發生,因為 Cygwin 1.7 定義了 _setjmp。因此,現在可在 Cygwin 中使用 LUA\_POSIXLUA\_USE\_LINUX,而不會產生警告。

「MYLDFLAGS=-s」為選用:它會清除執行檔(無需這些符號)的符號,藉此減少檔案大小。「RANLIB=strip --strip-unneeded」也為選用:這會減少 DLL 中不必要的符號數量。Lua Cygwin 套件使用「RANLIB=:」(也就是什麼也不做),也可以寫成「RANLIB=@:」(也就是沒有輸出)。預設的 Lua「RANLIB=ranlib」無法在 Windows DLL 中執行。

Lua Cygwin 套件使用「AR=$(CC) -shared -Wl,--enable-auto-image-base -Wl,--enable-auto-import -Wl,--out-implib,liblua.dll.a -o」。「-Wl,--out-implib,liblua.dll.a」會產生一個匯入函式庫,如果你需要的話(在基於 Windows 的 gcc 中其實是選用的)。「-Wl,--enable-auto-import」在 Cygwin 中應該是標準的 [6]。「-Wl,--enable-auto-image-base [7][8][9][10]」是一個選用的改進項目,但顯然現在預設會啟用 [11][12]。因此,看起來「-Wl,--enable-auto-image-base -Wl,--enable-auto-import」已不需要了。

如同 Lua Cygwin 套件一樣,你可能會希望設定 LUA\_CPATH\_DEFAULT 來使用 .dll(而非 .so)作為 Lua C 模組的副檔名,但這是選用的。

如需在 Cygwin 中使用 LuaRocks 的資訊,請見 [*4]

(Windows) Dev-C++ (MinGW)

要快速且乾淨(不要弄髒!:-))使用 Dev-C++ 編譯 Lua,請使用此 .bat 檔案:[17]。您可能必須在使用此 .bat 執行之前變更路徑(請將 SET PATH=C:\Dev-Cpp\Bin;C:\Dev-Cpp\lib\gcc-lib\mingw32\3.2;%PATH% 反映到您 Dev C++ 的目錄)。它會建置 lua.exe、luac.exe、lua5.dll 和 lualib5.dll。將其複製到 lua-5.0 目錄並執行。雖然不願意承認,但此 .bat 沒有任何保證(它在我的 Windows XP 和 2000 上執行),我只希望它會很有用(此外,它比 makefile 容易閱讀)。要使用 devCpp 編譯所有內容,請使用此 .bat/.cmd:[18]。如果您 DevCPP 不在 C:\Dev-Cpp\,您必須編輯此檔案。將檔案複製到 lua-5.0 目錄並執行,它會建置 liblua.a、liblualib.a、lua5.dll、lualib5.dll、lua.exe 和 luac.exe。我已在 dev-cpp 5 beta 上測試過。

(Windows) Dev-C++ 原生

可以在 Windows 中使用這些 devcpp 組態,建置 Lua 5.0.2(以及更高版本)。1. 下載 lua tar.gz 並將其解壓縮到您選擇的資料夾。2. 下載並將此檔案 [19] 解壓縮到 lua-5.0.2 資料夾中,以便您擁有稱為devcpp 的子資料夾 3 。開啟 devcpp 資料夾,並連續按兩下核心庫。dev 等。

請注意:將 -DLUA_API=__declspec(dllexport) 變更為 -DLUA_API='__declspec(dllexport)'

只要按下編譯按鈕,一切都應該很好。請注意在您的系統路徑中絕不能有任何 lua.dll。否則,標準庫和 lua.exe 可能會有連結到正確 dll 的問題。我不知道如何直接從 devcpp 檔案中設定此項。

(Windows) 建立向前 dll (5.1)

如 Lua Makefile 中指定的 Lua 5.1 DLL 的預設名稱為 lua51.dll。不過,有許多預先編譯的二進位檔案使用不同的慣例。當您使用某種慣例(例如 lua51.dll)的直譯器,並嘗試載入使用另一種慣例(lua5.1.dll)的模組時,就會出現真正問題。如果這兩個 dll 都存在,則兩個都會被載入,這將導致程式碼重複,以及與靜態變數重複相關的潛在錯誤(例如在一個 dll 中釋放一個記憶體區塊,而它是分配在另一個 dll 中可能導致無法預測的結果)。

解決方案是確保解釋器和所有模組使用相同的 dll。如果它們是使用不同的 dll 名稱連結,則你可以建立一種假 dll(稱為代理程式 dll 或轉送 dll),它會將所有 API 呼叫轉送至正確的 dll。在上述範例中,你可以建立一個名為 lua5.1.dll 的代理程式 dll,它會將所有呼叫轉送至 lua51.dll。這樣,解釋器和模組都會使用 dll(lua51.dll)的相同副本,避免上述問題。

你可以找到產生此類 DLL 的腳本,如下:LuaProxyDllThreeLuaProxyDllTwo

(Windows)以下是針對版本(5.2.2)使用的 CMakeLists.txt 檔案

這是一個最小的 CMakeLists 檔案

PROJECT ( lua )

IF( NOT WIN32 )
    message( FATAL_ERROR "Written for window only" )
ENDIF()

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# remove warnings
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS ) 

SET (HDR_LIBLUA
src/lapi.h src/lauxlib.h src/lcode.h src/lctype.h src/ldebug.h src/ldo.h src/lfunc.h
src/lgc.h src/llex.h src/llimits.h src/lmem.h src/lobject.h src/lopcodes.h src/lparser.h
src/lstate.h src/lstring.h src/ltable.h src/ltm.h src/lua.h src/luaconf.h src/lualib.h
src/lundump.h src/lvm.h src/lzio.h
)

#SET_SOURCE_FILES_PROPERTIES(${HDR_LIBLUA} PROPERTIES HEADER_FILE_ONLY TRUE)
#include_directories(src)

# Build Libraries
SET (SRC_LIBLUA
src/lapi.c src/lauxlib.c src/lbaselib.c src/lbitlib.c src/lcode.c src/lcorolib.c
src/lctype.c src/ldblib.c src/ldebug.c src/ldo.c src/ldump.c src/lfunc.c src/lgc.c
src/linit.c src/liolib.c src/llex.c src/lmathlib.c src/lmem.c src/loadlib.c src/lobject.c
src/lopcodes.c src/loslib.c src/lparser.c src/lstate.c src/lstring.c src/lstrlib.c
src/ltable.c src/ltablib.c src/ltm.c src/lundump.c src/lvm.c src/lzio.c
)

SET ( SRC_LUA src/lua.c )
SET ( SRC_LUAC src/luac.c )

# compile with C++ compiler
set_source_files_properties(${SRC_LIBLUA} ${SRC_LUA} ${SRC_LUAC} PROPERTIES LANGUAGE CXX)

# append headers to sources to make them show up in MSVC GUI
LIST(APPEND SRC_LIBLUA ${HDR_LIBLUA})

#Library
ADD_LIBRARY ( lualib ${SRC_LIBLUA} )

#DLL
ADD_LIBRARY ( lua5.2 SHARED ${SRC_LIBLUA} )
SET_TARGET_PROPERTIES (lua5.2 PROPERTIES DEFINE_SYMBOL  "LUA_BUILD_AS_DLL" )

#exe
ADD_EXECUTABLE ( lua    ${SRC_LUA}  )
ADD_EXECUTABLE ( luac  ${SRC_LUAC} )

#lua uses a DLL; luac uses a library
TARGET_LINK_LIBRARIES ( lua lua5.2 )
TARGET_LINK_LIBRARIES ( luac lualib )

複製並貼上這一段文字至 5.2.2 根目錄中的 CMakeLists.txt 檔案

使用如下的指令

cmake  -G "Visual Studio 10"

根據你的 dev studio 版本而定。使用 lua.sln 檔案編譯。

另請參閱


RecentChanges · 偏好設定
編輯 · 歷史記錄
最後於 2017 年 7 月 29 日上午 12:19 GMT 編輯 (diff)