偶然間看到Lua這種腳本語言,有點興趣,簡單學習了一下。html
發現Lua與C++之間能夠實現很是強的交互性。Lua中能夠使用C++中的函數,C++中也能夠使用Lua中的函數。由此能夠引起出不少奇思妙想了。函數
簡單來講,Lua動態的特性補充了C++的功能。固然,也看你具體怎麼用。學習
筆者常常使用Qt,故準備將Qt和Lua結合在一塊兒。想象一下在Lua腳本中調用以下代碼:測試
w = QWidget:new()
w:show()
而後彈出一QWidget的窗口,是多麼感人的一件事情呀。ui
好,下面開始配置環境吧。lua
1. 下載Lua 5.1。目前的最新版本是5.2,可是由於使用到的toLua不支持Lua 5.2,故仍然使用5.1版。spa
在http://www.lua.org/versions.html#5.1能夠找到5.1版的Lua,下載下來,解壓待用。code
2. 下載toLua。筆者找到的是目前最新的toLua 0.95,下載下來後,解壓。htm
將include/toLua++.h,src/lib中*.c/*.h文件,src/bin/toluabind.c,共8個文件複製到Lua解壓目錄/src目錄下,僅複製文件。blog
3. 編譯。在Lua解壓目錄下新建文件夾bin,新建一build.bat文件,輸入如下代碼:
@setlocal @if "%1" == "mingw" goto :build_mgw @if "%1" == "vs" goto :build_vs @if "%1" == "dist" goto :install @if "%1" == "" goto :build_mgw @echo usage: %1 [mingw|vs|dist] @goto :EOF :build_mgw @set srcdir=..\src\ @set CFLAGS=-s -O3 -Wall -I. "-DLUA_USER_H=<luacpath.h>" @echo build lua52.dll ... gcc %CFLAGS% -DLUA_BUILD_AS_DLL -c %srcdir%*.c @del lua.o luac.o gcc -s -mdll -o lua52.dll -Wl,--out-implib,liblua52.dll.a *.o @echo build lua.exe ... gcc %CFLAGS% -o lua.exe %srcdir%lua.c -L. -llua52 @echo build luac.exe ... gcc %CFLAGS% -c %srcdir%*.c @del lua.o luac.o ar rcs liblua52.a *.o gcc %CFLAGS% -o luac.exe %srcdir%luac.c -L. -static -llua52 @del *.o 2>nul goto :dist :build_vs @set srcdir=..\src\ @set MYCOMPILE=/nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE "/DLUA_USER_H=<luacpath.h>" @set MYLINK=link /nologo @set MYLIB=lib /nologo @set MYMT=mt /nologo @echo build lua52.dll ... %MYCOMPILE% /DLUA_BUILD_AS_DLL %srcdir%*.c @del lua.obj luac.obj %MYLINK% /DLL /out:lua52.dll *.obj if exist lua52.dll.manifest^ %MYMT% -manifest lua52.dll.manifest -outputresource:lua52.dll;2 %MYCOMPILE% /DLUA_BUILD_AS_DLL %srcdir%lua.c %MYLINK% /out:lua.exe lua.obj lua52.lib if exist lua.exe.manifest^ %MYMT% -manifest lua.exe.manifest -outputresource:lua.exe %MYCOMPILE% %srcdir%*.c del lua.obj luac.obj %MYLIB% /out:lua52s.lib *.obj %MYCOMPILE% %srcdir%luac.c %MYLINK% /out:luac.exe luac.obj lua52s.lib if exist luac.exe.manifest^ %MYMT% -manifest luac.exe.manifest -outputresource:luac.exe @del *.exp *.obj *.manifest goto :dist :dist @echo install ... @set dstdir=.\Lua52\ mkdir %dstdir% 2>nul mkdir %dstdir%clibs 2>nul mkdir %dstdir%include 2>nul mkdir %dstdir%lib 2>nul mkdir %dstdir%lua 2>nul copy /y *.dll %dstdir% >nul copy /y *.exe %dstdir% >nul copy /y *.a %dstdir%lib >nul copy /y %srcdir%lua*.h* %dstdir%include >nul copy /y %srcdir%laux*.h %dstdir%include >nul copy /y %dstdir%lua.exe %dstdir%lua52.exe >nul copy /y %dstdir%luac.exe %dstdir%lua52c.exe >nul :EOF echo finish
這是一位Lua愛好者爲編譯Lua 5.2編寫的腳步,在這裏能夠直接使用。
注意建議使用MinGW編譯,VS會致使一些問題。沒有安裝MinGW的能夠百度一下,配置好MinGW的環境,並將bin目錄加入環境變量path中。
4. 運行編譯腳步。建議先打開CMD窗口,在CMD窗口中進入該目錄,執行build.bat。這樣報錯的話能夠看到一些信息。
可能會有Warnning,不過仍是能夠順利經過編譯的。在生成的Lua52文件夾中,就有咱們想要的東西。
確保Lua52/lib目錄下,生成了liblua52.a文件。
5. 測試使用。使用MinGW編譯,建議使用MinGW版的Qt。
在Qt Creator中新建一個工程。刪除到只剩下mian.cpp便可。
複製Lua52/include下全部文件,以及以前複製的toLua++.h,到Qt工程目錄下。在Qt Creator中加入這些新文件。
複製Lua52/lib/liblua52.a文件到Qt工程目錄下。在Qt工程的*.pro文件中加入
LIBS+=../LuaTest/liblua52.a
筆者的工程名爲LuaTest,具體的目錄名按照你的工程名以及你的build文件夾地址修改。若是提示找不到文件,就該爲絕對路徑。
在main.cpp文件中,加入
extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" #include "tolua++.h" }
將main函數改成:
lua_State *lu = luaL_newstate(); luaL_openlibs(lu); //執行內存腳本 string str = "print (\"Hello world!\")"; luaL_loadbuffer(lu, str.c_str(), str.length(), "line"); lua_pcall(lu, 0, 0, 0);
順利運行則配置成功。(在.pro文件中加入CONFIG+=console,在項目-〉運行中勾選Run in terminal,能夠打開控制檯)
那麼如何作到在Lua中新建Qt的窗口呢?下篇博客繼續探討。
若有問題,能夠留言。發現錯誤,歡迎指正。