找回密码
 立即注册
搜索
查看: 318|回复: 0

Lua in Qt

[复制链接]

266

主题

0

回帖

1119

积分

管理员

积分
1119
发表于 2023-12-19 00:15:07 | 显示全部楼层 |阅读模式

简介

为应用程序增加一个脚本语言的支持是个不错的主意,可以动态地扩展程序的功能,增加用户的使用灵活性。为此查询去了解了一些脚本语言。目前来看,Lua 是个不错选择,原因如下:

  • 小巧可爱,代码简单,功能却足够强大;

  • 由标准 C 编写而成,易于集成在 C/C++ 开发的软件中;

  • 扩展性良好

  • 已被广泛使用,据说用户有魔兽世界、愤怒的小鸟等

好吧,撸上一把!

从官方下载源代码(Lua 官网),目前最新的版本是 5.3.1。在这里我要以动态链接库的形式使用它,所以要将源代码编译、构建为动态链接库:lua53.dll。

如何构建 Lua 的动态链接库?

一般只需将除 lua.c(解释器)和 luac.c(编译器)之外的所有头文件和源文件加入工程并修改配置文件 luaconf.h ,在其开头加入宏定义 #define LUA_BUILD_AS_DLL 即可。编译、构建过程没有遇到什么麻烦,很顺利就生成了 dll 文件(Qt 中如何创建和使用库)。要注意,这里生成的 dll 是用 c 语言写的,C++ 调用的时候可以直接包含头文件 lua.hpp。

动态链接库的编译开关比较有特色,可以学习一下。在 luaconf.h 定义了如下内容:


#if defined(LUA_BUILD_AS_DLL)  /* { */

#if defined(LUA_CORE) || defined(LUA_LIB)  /* { */

#define LUA_API __declspec(dllexport)

#else                      /* }{ */

#define LUA_API __declspec(dllimport)

#endif                     /* } */

#else              /* }{ */

#define LUA_API        extern

#endif             /* } */

在头文件的函数声明和源文件中的函数定义中都加了 LUA_API 声明,巧妙地通过在源文件中定义 LUA_CORELUA_LIB 而头文件中不定义的方式实现了编译动态库时使用了 __declspec(dllexport) 导出声明,而在用户包含头文件使用动态库时使用了 __declspec(dllimport) 导入声明。

如何使用这个动态链接库?

本文通过最简单的形式------控制台程序展示一下如何使用生成的 lua53.dll。

1、创建一个控制台程序项目

2、在项目文件中加入库的路径


LIBS += ./lua53.dll #makefile所在目录

在项目中加入 Lua 的头文件,放置于 lua53 文件夹(随意)。

3、编写 main()

参考 lua.c 源代码写 main.cpp 的代码。如果图省事,直接拷贝 lua.c 源代码覆盖 main.cpp 的代码,替换几个 Lua 头文件的引用为 #include "lua53/lua.hpp" 即可,效果跟直接编译解释器 lua.c 没有什么区别了。

如果需要对 Lua 的使用多些了解,可以着重看一下几个函数的用法:luaL_newstateluaL_openlibsluaL_dofileluaL_dostringlua_close 的基本用法。关于 Lua 的使用下次再写。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|棱讯科技 ( 粤ICP备2024228160号-2|粤公网安备44030002003510号 )

GMT+8, 2024-7-27 17:53 , Processed in 0.014787 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表