阡陌 发表于 2023-12-19 00:15:07

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]
查看完整版本: Lua in Qt