Lua in Qt
!(https://file.mculoop.com/images/2022/11/164854t5orm5aaxfpdlw5p_1668149868.jpeg)
## 简介
为应用程序增加一个脚本语言的支持是个不错的主意,可以动态地扩展程序的功能,增加用户的使用灵活性。为此查询去了解了一些脚本语言。目前来看,Lua 是个不错选择,原因如下:
- 小巧可爱,代码简单,功能却足够强大;
- 由标准 C 编写而成,易于集成在 C/C++ 开发的软件中;
- 扩展性良好
- 已被广泛使用,据说用户有魔兽世界、愤怒的小鸟等
好吧,撸上一把!
从官方下载源代码((http://www.lua.org/)),目前最新的版本是 5.3.1。在这里我要以动态链接库的形式使用它,所以要将源代码编译、构建为动态链接库:lua53.dll。
<!--more-->
## 如何构建 Lua 的动态链接库?
一般只需将除 lua.c(解释器)和 luac.c(编译器)之外的所有头文件和源文件加入工程并修改配置文件 luaconf.h ,在其开头加入宏定义 `#define LUA_BUILD_AS_DLL` 即可。编译、构建过程没有遇到什么麻烦,很顺利就生成了 dll 文件((/thread-16-1-1.html))。要注意,这里生成的 dll 是用 c 语言写的,C++ 调用的时候可以直接包含头文件 lua.hpp。
动态链接库的编译开关比较有特色,可以学习一下。在 luaconf.h 定义了如下内容:
```cpp
#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_CORE` 或 `LUA_LIB` 而头文件中不定义的方式实现了编译动态库时使用了 `__declspec(dllexport)` 导出声明,而在用户包含头文件使用动态库时使用了 `__declspec(dllimport)` 导入声明。
## 如何使用这个动态链接库?
本文通过最简单的形式------控制台程序展示一下如何使用生成的 lua53.dll。
1、创建一个控制台程序项目
!(https://file.mculoop.com/images/2022/11/164854o9cz6ofl3yj3zq99_1668150134.jpeg)
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_newstate`、`luaL_openlibs`、`luaL_dofile`、`luaL_dostring`、 `lua_close` 的基本用法。关于 Lua 的使用下次再写。
页:
[1]