Lua 5.3 源碼解讀(一) VS 2015 編譯源碼

引言:

用 lua 來編寫功能的時間很長,但對於 lua 的底層原理其實知之甚少,只知道它是開源的,用 C 語言寫的。今天趁着手頭任務不緊,想着還是花點時間讀讀源碼吧,總得調點噁心自己的事情乾乾知道自己的極限在哪裏。

起步:

1.源碼下載:

首先先到官網下載一份最新版的 lua 源碼 ,這裏我選擇最新的 lua-5.3.4.tar.gz

先解壓看一下源碼中的目錄結構:

lua-5.3.4
|-- doc
|-- src
|-- Makefile
|-- README

其中 doc 中是官方提供的使用手冊,而 src 中保存這 lua 的所有 C 源碼,在正式開始看源碼之前,建議先看一下 doc/readme.html 這個官方提供的說明文檔。

2.編譯環境:

通常都是在 Unix 或基於 Unix 的系統下來編譯 lua 的源碼,例如:Linux 或 Mac OS X 等,但是作爲一個前端開發者,顯然使用 Windows 會更加得心應手一點,參考官方的手冊的這段內容:


Building Lua on other systems

If you’re not using the usual Unix tools, then the instructions for building Lua depend on the compiler you use. You’ll need to create projects (or whatever your compiler uses) for building the library, the interpreter, and the compiler, as follows:

library:
  lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c lauxlib.c lbaselib.c lbitlib.c lcorolib.c ldblib.c liolib.c lmathlib.c loslib.c lstrlib.c ltablib.c lutf8lib.c loadlib.c linit.c

interpreter:
    library, lua.c

compiler:
    library, luac.c

To use Lua as a library in your own programs you’ll need to know how to create and use libraries with your compiler. Moreover, to dynamically load C libraries for Lua you’ll need to know how to create dynamic libraries and you’ll need to make sure that the Lua API functions are accessible to those dynamic libraries — but don’t link the Lua library into each dynamic library. For Unix, we recommend that the Lua library be linked statically into the host program and its symbols exported for dynamic linking; src/Makefile does this for the Lua interpreter. For Windows, we recommend that the Lua library be a DLL. In all cases, the compiler luac should be linked statically.

As mentioned above, you may edit src/luaconf.h to customize some features before building Lua.


大概意思就是:

需要創建若干個工程,用來分別編譯生成三個對象:lua 的庫文件lua 解釋器lua 的編譯器

而且,官方建議:不要將 Lua 庫鏈入每個動態庫

  • 在 Unix 下,建議把 Lua 庫靜態鏈入宿主程序中,然後將符號導出用與動態鏈接( src/Makefile 就是這樣處理 Lua 解釋器的);

  • 在 Windows 下,建議把 Lua 庫編譯成一個 DLL

不管是哪個平臺下,編譯器 luac 都應該靜態鏈接。

編譯步驟:

此時,我的 Windows 已經安裝了 Visual Studio 2015,我打算直接使用它來編譯,從上面的內容可知我們需要編譯得到三個對象,分別是:lua 的庫文件lua 解釋器lua 的編譯器,大致步驟如下:

1.安裝一下 Visual C++ 插件:

因爲之前使用 VS 主要是進行 C# 開發,所以並沒有安裝對於 C++ 支持的插件,假如已安裝可以忽略此步驟:【文件】—>【新建】—>【項目…】—>【 Visual C++】—>【 安裝適用於 Windows 桌面的 Visual C++ 2015 工具】,此工具包含了:編譯器、通用 CRT 和 Windows 8.1 SDK。

2.生成庫文件 Lua5.3.4.lib

  • 創建一個 C++ 的 Win32 控制檯應用程序:

    步驟如下:【文件】—>【新建】—>【項目…】—>【 Visual C++】—>【Win32 控制檯應用程序】,取名爲 Lua5.3.4。在應用程序設置中勾選應用類型爲 【靜態庫】 ,附加選項中去掉 【預編譯頭】 的勾選,點擊 【完成】。新建完畢後得到如下目錄結構:

    Lua5.3.4
    |-- 引用
    |-- 外部依賴項
    |-- 頭文件
    |-- 源文件
    |-- 資源文件
    |-- ReadMe.txt

  • 源碼引入:

    • 創建源碼目錄: 在當前項目根目錄下創建一個文件夾,取名爲 LuaSrc ,然後將上面 lua-5.3.4 源碼包解壓目錄下 /src 目錄中的所有文件都複製到此目錄中。

    • 頭文件引入:【頭文件】右鍵 —> 【添加】—>【現有項…】,選擇 LuaSrc 目錄,從該目錄中選中所有 .h 後綴的文件,點擊 【添加】將源碼頭文件都添加進來;

    • 源文件引入:【源文件】右鍵 —> 【添加】—>【現有項…】,選擇 LuaSrc 目錄,從該目錄中選中所有 .c 後綴的文件(注:這裏需要剔除 lua.cluac.c ,這兩個源文件不引進來),點擊 【添加】將源碼源文件都添加進來。

  • 配置屬性:

    • 編譯附加目錄: 【Lua5.3.4】右鍵—>【屬性】—>【C/C++】—>【常規】—>【附加包含目錄】,填寫 LuaSrc 目錄的路徑,然後點擊 【應用】讓設置生效;

    • 編譯目標: 切換到 【C/C++】—>【高級】,選中 【編譯爲】,切換其參數爲 【編譯爲 C 代碼 (/TC)】,點後點擊 【應用】讓設置生效;

    • 最後點擊 【確定】 關閉配置屬性界面。
  • 編譯庫:

    設置菜單欄中選擇編譯目標版本爲 【Release】,然後點擊【本地 Windows 調試器】按鈕進行編譯,輸出欄輸出如下內容表示編譯成功:

    1>------ 已啓動生成: 項目: Lua5.3.4, 配置: Release Win32 ------
    1>  Lua5.3.4.vcxproj -> E:\Skynet\Tools\Lua5.3.4\Release\Lua5.3.4.lib
    ========== 生成: 成功 1 個,失敗 0 個,最新 0 個,跳過 0 個 ==========

    可以在日誌輸出的目錄下獲得編譯好的 Lua5.3.4.lib 文件,這是上面說到的三個目標對象中的第一個,即 lua 的庫文件

3.生成解釋器 Lua.exe

  • 創建一個 C++ 的 Win32 控制檯應用程序:

    參考上面的步驟,創建一個 C++ 的 Win32 控制檯應用程序,只是在應用程序設置步驟中不在選擇 【靜態庫】而是選擇【控制檯應用程序】,選勾選爲【空項目】,而且不用去掉【預編譯頭】的勾選,項目取名爲 Lua

  • 源碼引入:

    步驟與上述基本一致,只是引入源文件的時候,只剔除 luac.c ,把 lua.c 和其他 *.c 文件都引入到源文件中。

  • 編譯解釋器:

    直接設置菜單欄中選擇編譯目標版本爲 【Release】,然後點擊【本地 Windows 調試器】按鈕進行編譯,假如直接彈出一個命令行窗口,並且窗口內輸出:

    Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio
    >

    可以直接輸入一個 Lua 打印語句,Enter 即可輸出執行結果,這就表示解釋器生成成功,可以在項目根目錄下的 Release 目錄下找到一個 Lua.exe 文件,雙擊即可運行,並且可以直接在彈出窗口進行 lua 語句的運行,這就是上面說到的三個目標對象中的第二個,即 lua 的解釋器

4.生成編譯器 Luac.exe

步驟與上一步生成 lua 的解釋器基本相同,唯一的區別在於源碼引入 步驟,只剔除 lua.c ,把 luac.c 和其他 *.c 文件都引入到源文件中。然後運行項目,在 Release 目錄下可以得到一個 luac.exe ,這是上面說到的三個目標對象中的第三個,即 lua 的編譯器

小結:

至此,我們就完成了 lua 最主要的三個工具的生成操作,後面我們要開始正式地解讀 lua 的源碼。

參考資料:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章