天天看點

<轉>windows下編譯lua源碼

<轉>windows下編譯lua源碼

所有的lua源碼都放在了 src 檔案夾下,當然,不同的lua版本目錄結構有可能不一樣,但是都會有 src 這個檔案夾,隻有這個才是我們編譯必須的。而且lua越做越精簡了,5.1的版本裡面還有一些test的例子之類的,5.2就隻剩下必須的内容了。

然後,如果是第一次編譯lua,還是建議看一下doc檔案夾下面的 readme.html。我就是通過那個才知道編譯lua必備的檔案的。

通過readme,我們知道了編譯lua其實包含3部分内容:編譯lua的庫檔案,編譯lua解釋器,編譯lua編譯器。

因為我的電腦上安了vc的編譯器cl,是以這3個部分可以用一個批處理檔案搞定,下面我們就來寫這個批處理,說到底就是3條編譯指令罷了。

在readme裡面已經提到了這3個部分需要的内容,如下圖:

<轉>windows下編譯lua源碼

在上面那個檔案夾下建一個新的bat檔案,如下:

<轉>windows下編譯lua源碼

然後開始寫這個bat,先來生成lua的庫檔案:

cd src 

cl /O2 /W3 /c /DLUA_BUILD_AS_DLL l*.c 

del lua.obj luac.obj 

link /DLL /out:lua52.dll l*.obj 

cd .. 

這樣就可以在src目錄下生成lua52.dll了。注意到我去掉了lua.obj和luac.obj,因為根據readme這兩個檔案不是必須的。

然後再生成一個解釋器,接着在上面的代碼裡面加2行:

cl /O2 /W3 /c /DLUA_BUILD_AS_DLL lua.c 

link /out:lua.exe lua.obj lua52.lib 

其實就是重新編譯lua.c,然後連結生成的lua52.lib就OK了。

最後生成編譯器,繼續加2行,并添加編譯luac.c:

cl /O2 /W3 /c /DLUA_BUILD_AS_DLL lua.c luac.c 

del lua.obj 

link /out:luac.exe l*.obj 

這樣,運作這個批處理就可以在src目錄下生成所需的lua庫lua52.dll以及解釋器lua.exe和編譯器luac.exe了。

當然,如果你輕按兩下這個批處理,黑框一閃而過,然後發現src下什麼都沒有生成,那是因為你的vc編譯器cl沒有被你放入windows系統環境中,這樣的話你就隻能通過vs或者是vc的指令處理器來運作這個批處理了或者把你的vs安裝目錄放到系統環境中去,比如在我的電腦上是這個路徑:D:\Program Files\Visual Studio 2005\VC\bin。别問我怎麼放到系統環境中去,百度吧少年。

好人做到底,貼出用vs指令處理器編譯需要幹的事情:

<轉>windows下編譯lua源碼

然後進入到mylua.bat的目錄,接着直接運作這個批處理就OK了。簡單吧。

<轉>windows下編譯lua源碼

因為打開了3級警告開關,是以有很多警告,可以去不理睬。結果如下:

<轉>windows下編譯lua源碼

最後上傳這個bat檔案。

整個編譯過程都OK,提兩點:

一個是在cl編譯的時候加入了一個自定義的宏 /DLUA_BUILD_AS_DLL 這是因為在luaconf.h檔案中定義了LUA_BUILD_AS_DLL宏,它控制了__declspec(dllexport)和__declspec(dllimport)的定義,必須加上這個開關才有這兩個定義,否則編譯出來的DLL沒有任何導出函數。

另一個是在最後生成編譯器的時候,會發現我重新連結了所有的obj,而不是像生成解釋器的時候一樣,直接連結Lua52.lib。這是因為我這麼做的時候發生了報錯,提示有部分函數找不到。暫時沒有明白是什麼原因,有人說是bug,暫且不去管他。