偶然间看到Lua这种脚本语言,有点兴趣,简单学习了一下。

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

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

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

  1. w = QWidget:new()
  2. 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文件,输入以下代码:

  1. @setlocal
  2. @if "%1" == "mingw" goto :build_mgw
  3. @if "%1" == "vs" goto :build_vs
  4. @if "%1" == "dist" goto :install
  5. @if "%1" == "" goto :build_mgw
  6.  
  7. @echo usage: %1 [mingw|vs|dist]
  8. @goto :EOF
  9.  
  10. :build_mgw
  11. @set srcdir=..\src\
  12. @set CFLAGS=-s -O3 -Wall -I. "-DLUA_USER_H=<luacpath.h>"
  13.  
  14. @echo build lua52.dll ...
  15. gcc %CFLAGS% -DLUA_BUILD_AS_DLL -c %srcdir%*.c
  16. @del lua.o luac.o
  17. gcc -s -mdll -o lua52.dll -Wl,--out-implib,liblua52.dll.a *.o
  18. @echo build lua.exe ...
  19. gcc %CFLAGS% -o lua.exe %srcdir%lua.c -L. -llua52
  20. @echo build luac.exe ...
  21. gcc %CFLAGS% -c %srcdir%*.c
  22. @del lua.o luac.o
  23. ar rcs liblua52.a *.o
  24. gcc %CFLAGS% -o luac.exe %srcdir%luac.c -L. -static -llua52
  25. @del *.o 2>nul
  26. goto :dist
  27.  
  28. :build_vs
  29. @set srcdir=..\src\
  30. @set MYCOMPILE=/nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE "/DLUA_USER_H=<luacpath.h>"
  31. @set MYLINK=link /nologo
  32. @set MYLIB=lib /nologo
  33. @set MYMT=mt /nologo
  34.  
  35. @echo build lua52.dll ...
  36. %MYCOMPILE% /DLUA_BUILD_AS_DLL %srcdir%*.c
  37. @del lua.obj luac.obj
  38. %MYLINK% /DLL /out:lua52.dll *.obj
  39. if exist lua52.dll.manifest^
  40. %MYMT% -manifest lua52.dll.manifest -outputresource:lua52.dll;2
  41. %MYCOMPILE% /DLUA_BUILD_AS_DLL %srcdir%lua.c
  42. %MYLINK% /out:lua.exe lua.obj lua52.lib
  43. if exist lua.exe.manifest^
  44. %MYMT% -manifest lua.exe.manifest -outputresource:lua.exe
  45. %MYCOMPILE% %srcdir%*.c
  46. del lua.obj luac.obj
  47. %MYLIB% /out:lua52s.lib *.obj
  48. %MYCOMPILE% %srcdir%luac.c
  49. %MYLINK% /out:luac.exe luac.obj lua52s.lib
  50. if exist luac.exe.manifest^
  51. %MYMT% -manifest luac.exe.manifest -outputresource:luac.exe
  52. @del *.exp *.obj *.manifest
  53. goto :dist
  54.  
  55. :dist
  56. @echo install ...
  57. @set dstdir=.\Lua52\
  58. mkdir %dstdir% 2>nul
  59. mkdir %dstdir%clibs 2>nul
  60. mkdir %dstdir%include 2>nul
  61. mkdir %dstdir%lib 2>nul
  62. mkdir %dstdir%lua 2>nul
  63.  
  64. copy /y *.dll %dstdir% >nul
  65. copy /y *.exe %dstdir% >nul
  66. copy /y *.a %dstdir%lib >nul
  67. copy /y %srcdir%lua*.h* %dstdir%include >nul
  68. copy /y %srcdir%laux*.h %dstdir%include >nul
  69. copy /y %dstdir%lua.exe %dstdir%lua52.exe >nul
  70. copy /y %dstdir%luac.exe %dstdir%lua52c.exe >nul
  71.  
  72. :EOF
  73. 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文件中,加入

  1. extern "C" {
  2. #include "lua.h"
  3. #include "lualib.h"
  4. #include "lauxlib.h"
  5. #include "tolua++.h"
  6. }

将main函数改为:

  1. lua_State *lu = luaL_newstate();
  2. luaL_openlibs(lu);
  3.  
  4. //执行内存脚本
  5. string str = "print (\"Hello world!\")";
  6. luaL_loadbuffer(lu, str.c_str(), str.length(), "line");
  7. lua_pcall(lu, , , );

顺利运行则配置成功。(在.pro文件中加入CONFIG+=console,在项目-〉运行中勾选Run in terminal,可以打开控制台)

那么如何做到在Lua中新建Qt的窗口呢?下篇博客继续探讨。

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

Win32下 Qt与Lua交互使用(一):配置Qt下Lua运行环境的更多相关文章

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

    Lua与C++之间可以实现非常强的交互性.Lua中可以使用C++中的函数,C++中也可以使用Lua中的函数.由此可以引发出很多奇思妙想了. 简单来说,Lua动态的特性补充了C++的功能.当然,也看你具 ...

  2. Win8操作系统下IIS如何配置asp.net的运行环境(win7同样)

    一.把鼠标放在电脑屏幕的左下角然后右击,弹出如下图菜单,选择“程序和功能”(快捷键win+X).(win7点击电脑左下角的“开始”,然后点击“控制面板”打开程序与功能界面): 二.进入程序与功能界面后 ...

  3. win7和win2008 r2下配置IIS7(ASP.net运行环境)

    win7和win2008 r2下配置IIS7(ASP.net运行环境) 1.先要设置应用程序池(ApplicationPool)为Classic.NETAppPool,而不是默认的DefaultApp ...

  4. CentOS 下用的是lnmp 的包配置Nginx 下的CI伪静态(搞爽了)

    server { listen ; server_name cy.com; index index.html index.htm index.php default.html default.htm ...

  5. linux环境下配置java WEB项目运行环境,jdk8+tomcat8+mysql5.7.11 新手向

    一:安装jdk 1.下载jdk  在oracle下载东西的时候因为oracle的一些验证机制,所以需要在链接前面添加一些参数 wget --no-check-certificate --no-cook ...

  6. win2008 r2下配置IIS7(ASP.net运行环境)

    一.常规配置: 1.先要设置应用程序池(ApplicationPool)为Classic.NETAppPool. 2.选中左侧的“应用程序池”,选中“Classic.NETAppPool”,单击右侧的 ...

  7. 03 sublime text3下配置Java的编译运行环境

    参考如下文章,加入了自己的干货: https://blog.csdn.net/qq_38295511/article/details/81140069 https://blog.csdn.net/qq ...

  8. 02 sublime text3下配置Python的编译运行环境

    内容参考如下文章,加入了自己的干货: https://www.cnblogs.com/huluwahaha/p/7503930.html 在sublime中如何配置Python的编译环境呢? 打开Su ...

  9. Linux 下编译、安装、配置 QT

    转自Linux 下编译.安装.配置 QT 注意:编译安装耗时费力,且很容易出错,要不断调整编译参数,不推荐使用,否则这将会是一个纠结痛苦的过程. 打算做嵌入式图像处理,计划方案嵌入式Linux+Ope ...

  10. Windows7系统下JAVA运行环境下载、安装和设置(第二次更新:2012年03月14日)

    1.下载 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html,(由于Sun于2009年被oracle收购所以网址 ...

随机推荐

  1. seaJs 使用

    开始使用seajs的时候折磨了我好一阵.光是各种概念就让新手难理解.现在弄清楚了,上个实践以备忘.目录结构如图. 1.文件 sea.html   main.js  a.js  b.js  c.js 最 ...

  2. 21_resultMap和resultType总结

    [resultType] [ 作用 ] 将查询结果按照SQL列名与pojo属性名一致性 映射到pojo中. [ 使用场合 ] 常见的一些明细记录的展示,比如用户购买商品的明细,将关联查询信息全部展示在 ...

  3. 2016/7/7 自定义函数copy

    题目:输入整数n(n<=10000),表示接下来将会输入n个实数,将这n个实数存入数组a中.请定义一个数组拷贝函数将数组a中的n个数拷贝到数组b中. 分析: (1)输入n,再输入n个实数存入数组 ...

  4. Xml通用操作类

    using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml ...

  5. 不要停留在表面,MVC 3 我们要深入一些

    其实在MVC 中只存在三大组件,Model.View.Controller,其中Model用来作为业务逻辑处理,Controller负责的是Model和View的交互,View负责页面显示. 这是非常 ...

  6. 扩展:gridview 空数据时显示表头

    2015年7月14日16:50:06  Gridview 默认展示数据时,若数据为空,则表格不显示,显示不美观. 针对此问题进行扩展: using System.Web.UI.WebControls; ...

  7. 自定义弹出div对话框

    <style type="text/css"> html,body{height:100%;overflow:hidden;} body,div,h2{margin:0 ...

  8. python with关键字学习

    1.with语句时用于对try except finally 的优化,让代码更加美观, 例如常用的开发文件的操作,用try except finally 实现: f=open('file_name', ...

  9. Ubuntu 下部署asp.net运行环境

    在Ubuntu下部署asp.net运行环境,网上教程很多,基本都是编译Mono源码,然后安装jexus.但是可能是我最近RP不太好,编译Mono源码一直都是失败,无奈之下只好找另外的方法安装了. 网上 ...

  10. MVC5添加控制器总是报“Multiple object sets per type are not supported”

    http://www.asp.net/mvc/tutorials/mvc-5/introduction/creating-a-connection-string 按照上面的指导做练习,  总报小面的错 ...