用 Visual Studio 在 windows 編譯 lua-5.4.6

環境
windows 11 64bit
Visual Studio 2022
Lua 5.4.6

在官網下載 lua-5.4.6.tar.gz
https://www.lua.org/

用 7-zip 解壓縮兩次就可以

會得到一個這樣的資料夾

目標是得到
include 資料夾
x86\Debug\lua54.lib 連結函式庫
x86\Release\lua54.lib 連結函式庫
x64\Debug\lua54.lib 連結函式庫
x64\Release\lua54.lib 連結函式庫

將資料夾分成這樣

把解壓縮後的資料夾都放進這些資料夾
然後在每個資料夾裡多放 2 個檔案

將它們放進分別的資料夾

VC_x86.bat

@echo off
%comspec% /k ""C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat"" x86

VC_x64.bat

@echo off
%comspec% /k ""C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat"" x64

compile_Debug.bat

md bin
md include
md lib

cd src
cl /c /nologo /W3 /O2 /Ob1 /Oi /Gs /MDd *.c
del lua.obj luac.obj
link /LIB /out:lua54.lib /verbose:lib *.obj
copy lua54.lib ..\lib\lua54.lib
del *.obj *.lib *.dll *.exp
cd ..\
echo Compile lua54.lib successfully...

cd src
cl /c /nologo /W3 /O2 /Ob1 /Oi /Gs /MDd /DLUA_BUILD_AS_DLL /D_CRT_SECURE_NO_DEPRECATE *.c
del lua.obj luac.obj
link /DLL /out:lua54.dll /verbose:lib *.obj
copy lua54.dll ..\lib\lua54.dll
del *.obj *.lib *.dll *.exp
cd ..\
echo Compile lua54.dll successfully...

cd src
cl /c /nologo /W3 /O2 /Ob1 /Oi /Gs /MDd *.c
del luac.obj
link /out:lua54.exe /verbose:lib *.obj
copy lua54.exe ..\bin\lua54.exe
del *.obj *.lib *.dll *.exp *.exe
cd ..\
echo Compile lua54.exe successfully...

cd src
cl /c /nologo /W3 /O2 /Ob1 /Oi /Gs /MDd *.c
del lua.obj
link /out:luac54.exe /verbose:lib *.obj
copy luac54.exe ..\bin\luac54.exe
del *.obj *.lib *.dll *.exp *.exe
cd ..\
echo Compile luac54.exe successfully...

cd src
copy lauxlib.h ..\include\lauxlib.h
copy lua.h ..\include\lua.h
copy lua.hpp ..\include\lua.hpp
copy luaconf.h ..\include\luaconf.h
copy lualib.h ..\include\lualib.h
cd ..\
echo Copy lua include file successfully...

compile_Release.bat

md bin
md include
md lib

cd src
cl /c /nologo /W3 /O2 /Ob1 /Oi /Gs /MD *.c
del lua.obj luac.obj
link /LIB /out:lua54.lib /verbose:lib *.obj
copy lua54.lib ..\lib\lua54.lib
del *.obj *.lib *.dll *.exp
cd ..\
echo Compile lua54.lib successfully...

cd src
cl /c /nologo /W3 /O2 /Ob1 /Oi /Gs /MD /DLUA_BUILD_AS_DLL /D_CRT_SECURE_NO_DEPRECATE *.c
del lua.obj luac.obj
link /DLL /out:lua54.dll /verbose:lib *.obj
copy lua54.dll ..\lib\lua54.dll
del *.obj *.lib *.dll *.exp
cd ..\
echo Compile lua54.dll successfully...

cd src
cl /c /nologo /W3 /O2 /Ob1 /Oi /Gs /MD *.c
del luac.obj
link /out:lua54.exe /verbose:lib *.obj
copy lua54.exe ..\bin\lua54.exe
del *.obj *.lib *.dll *.exp *.exe
cd ..\
echo Compile lua54.exe successfully...

cd src
cl /c /nologo /W3 /O2 /Ob1 /Oi /Gs /MD *.c
del lua.obj
link /out:luac54.exe /verbose:lib *.obj
copy luac54.exe ..\bin\luac54.exe
del *.obj *.lib *.dll *.exp *.exe
cd ..\
echo Compile luac54.exe successfully...

cd src
copy lauxlib.h ..\include\lauxlib.h
copy lua.h ..\include\lua.h
copy lua.hpp ..\include\lua.hpp
copy luaconf.h ..\include\luaconf.h
copy lualib.h ..\include\lualib.h
cd ..\
echo Copy lua include file successfully...

分別編譯

以 x86_Release 為例,雙擊執行

輸入 compile_Release

執行完成後就會產生 include 和 lib 資料夾

其他版本也執行完成

將 lib 檔分資料夾放好
include 資料夾內容都一樣
所以可以不用特意去分

這樣函式庫就編譯好了

lua 執行檔則是在各自的 bin 資料夾裡

編譯指令整理

/c只編譯不連結
/nologo不顯示 compiler 資訊
/W3警告級別
/O2最大化速度
/Ob1允許 inline
/Oi生成內在函式
/Gs控制堆疊
/verbose:lib顯示詳細記錄

這裡提供 8 個 compile 指令檔
https://www.dropbox.com/s/nhcwvmsb92qu7ch/lua544_VS_compile.zip

編譯時要特別注意這個問題
MSVC 與 CRT 之間的恩怨情仇
https://blog.xuite.net/kamory0931/fightdreamer/243316361

回到目錄
https://husking-studio.com/extending-lua-with-c

參考網址
https://www.cnblogs.com/lsgxeva/p/7726463.html
https://www.twblogs.net/a/5f03bb1a5352062f754ec5f1
https://docs.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-alphabetically?view=msvc-160

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *