• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Win32下Qt与Lua交互使用:配置Qt下Lua运行环境Lua与C++之间可以实现非常强的交互性。L ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

    简单来说,Lua动态的特性补充了C++的功能。当然,也看你具体怎么用。

    笔者经常使用Qt,故准备将Qt和Lua结合在一起。想象一下在Lua脚本中调用如下代码:

w = QWidget:new()
w:show()

    然后弹出一QWidget的窗口,是多么感人的一件事情呀。

 

    好,下面开始配置环境吧。

    1. 下载Lua 5.1。目前的最新版本是5.2,但是因为使用到的toLua不支持Lua 5.2,故仍然使用5.1版。

        在http://www.lua.org/versions.html#5.1可以找到5.1版的Lua,下载下来,解压待用。

    2. 下载toLua。笔者找到的是目前最新的toLua 0.95,下载下来后,解压。

        将include/toLua++.h,src/lib中*.c/*.h文件,src/bin/toluabind.c,共8个文件复制到Lua解压目录/src目录下,仅复制文件。

    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的窗口呢?下篇博客继续探讨。

    如有问题,可以留言。发现错误,欢迎指正。

    简单来说,Lua动态的特性补充了C++的功能。当然,也看你具体怎么用。

    笔者经常使用Qt,故准备将Qt和Lua结合在一起。想象一下在Lua脚本中调用如下代码:

w = QWidget:new()
w:show()

    然后弹出一QWidget的窗口,是多么感人的一件事情呀。

 

    好,下面开始配置环境吧。

    1. 下载Lua 5.1。目前的最新版本是5.2,但是因为使用到的toLua不支持Lua 5.2,故仍然使用5.1版。

        在http://www.lua.org/versions.html#5.1可以找到5.1版的Lua,下载下来,解压待用。

    2. 下载toLua。笔者找到的是目前最新的toLua 0.95,下载下来后,解压。

        将include/toLua++.h,src/lib中*.c/*.h文件,src/bin/toluabind.c,共8个文件复制到Lua解压目录/src目录下,仅复制文件。

    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的窗口呢?下篇博客继续探讨。

    如有问题,可以留言。发现错误,欢迎指正。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C++混合编程之idlcpp教程Lua篇(3) - Kunana发布时间:2022-07-22
下一篇:
nginx+lua 记一次后端程序压缩数据后导致前端乱码问题发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap