• Win32下 Qt与Lua交互使用:配置Qt下Lua运行环境


    Lua与C++之间可以实现非常强的交互性。Lua中可以使用C++中的函数,C++中也可以使用Lua中的函数。由此可以引发出很多奇思妙想了。

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

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

  • 相关阅读:
    一些至理名言
    移除快捷方式上面那个丑陋的小箭头
    一些浏览器插件
    yahoo给出的关于网站优化的建议
    javascript 事件流
    关于mongodb的一些笔记
    WebStorm
    给go添加各种package
    工具类 util.Date 日期类
    几种简单排序算法
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4070840.html
Copyright © 2020-2023  润新知