c++ + swig + lua ,三位一体,组合式开发

最近在做一个项目,然后出现了一个需求,就是需要使用C++ 开发软件,然后内置集成一个lua引擎,

lua引擎调用C++ 的接口,通过脚本来实现一些内置的功能。

我之前的做法是自己做适配层,自己来处理接口相关的事情。

然后通过插件的方式导出接口,最后自己来处理接口,自己来调用。

但是有个问题就是,我每次都要自己重新处理接口,每当出现新的接口的时候,我还要自己添加。

太费事,太繁琐。

直到有一天,我接触到了一套网游的源码,

网游大部分内置脚本都是lua,但是由于开发语言是C++ ,就涉及到了lua 和C++ 交互的问题,

这套网游源码给出了一个解决方案,就是 swig(swigwin)。

好了,进入正题,

swigwin 是什么,swig 是什么。

简单地说,它是一个接口处理工具,能处理多个不同平台和不同语言的接口。

http://www.swig.org/download.html

具体可以看官网。

准备工作:

C++ : vs 任意版本的编译器,我这里使用的是vs2017

lua : 任意版本的lua 引擎,我这里选择的是最新版lua5.4

swig : 上面官网可以下载,我这里使用的是最新版 swigwin4.0.2

开始干活:

使用vs2017,编译lua 脚本引擎。

然后,将要提供给lua 用的函数找出来。

根据不同的模块,写入不同的swig配置文件,例如

1 /**/
2 %module zoo
3 
4 %{
5 #include "luacpp.h"
6 %}
7 
8 int ZooPrint(char *szPrint);

这里需要解释一下,

第二行的zoo,是当前模块所在的包名字,或者是生成lua接口之后的库名字,

第四行和第六行之间的内容,会直接保留到生成的文件中,

第八行,是需要处理的函数,这个函数会被处理成lua 的接口。

这个文件准备好之后,就可以使用命令来处理这个文件了,

swig -c++ -lua -Wall swi.i

命令如上,含义是,调用swig 来处理一个 C++ 接口,导出为 lua 接口,-Wall 不关心,最后一个参数是配置文件名字,

执行了这条命令之后,会立刻在当前目录下生成一个叫做

swi_wrap.cxx

的文件,这个文件是个C++ 的源文件,它就是生成的接口文件。

这个文件非常大,无法完整地扔出来

SWIGEXPORT int SWIG_init(lua_State L) / default Lua action */

主要函数就是这一个,这是当前文件的对外接口,

参数是一个lua 解释器对象,功能是给这个解释器对象增加当前接口内的函数,之后可以直接用,

这里需要注意 SWIG_init 是一个宏,

只需要在lua解释器代码中,解释器对象初始化的时候调用一下此接口,内部的函数就可以使用了,

大致就是如下:

c++ + swig + lua ,三位一体,组合式开发

c++ + swig + lua ,三位一体,组合式开发

c++ + swig + lua ,三位一体,组合式开发

这里的zoo ,其实就是模块名,

除了这个函数,在接口文件中还有一个重要的结构,用来记录注册的函数,统一注册

c++ + swig + lua ,三位一体,组合式开发

重要的东西就这些,通过以上,就将C++接口导出给lua 了,

然后项目编译,链接,就可以执行了。

执行之后是这样:

c++ + swig + lua ,三位一体,组合式开发

需要“包名.函数名”然后调用,

有个问题是,这里需要用一个变量来接返回值,否则它会自动把返回值也打印出来,

并且,返回值的类型实际上是int ,但是这里展示出来是个 float,因为lua 的number型都是浮点数。

好了,到这里,整套开发流程就都结束了。

这里记录一下,我怕未来某一天会忘了。

原文链接: https://www.cnblogs.com/suanguade/p/13348216.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/200635

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午8:29
下一篇 2023年2月12日 下午8:30

相关推荐