现在的位置: 首页 > 综合 > 正文

Lua脚本调用C++动态库

2012年04月18日 ⁄ 综合 ⁄ 共 2084字 ⁄ 字号 评论关闭

前言:又是N久没上来了,也没什么新鲜话想说。反正最近是被杭州的房价憋得抑郁,但是也是只能对自己说要“蛋腚”!今天又被这个lua调用DLL给抑郁了一把,还好网上搜来搜去,终于搜到一位“有识之士”的帖子,帮我搞定了这个“憋屈”的问题。最近很懒,懒得写东西。

 

  Lua调用C的DLL的例子网上也不是很多,其实要说很多的话,转帖是大部分的形式,有好有坏吧。转得多了,倒是让人看得郁闷,因为搜了半天都是一样的东西,甚至没有自己想要的,好处也有,有需要的人,随便一搜就搜到了,顿时心情不错,对社会的“愤青”又少了几个。因为真的很难找到,所以,我还是做做好人把东西这里发一下,顺便修修补补几下。

  先来看一段dll的cpp吧,没啥东西,就是个demo:

 

  我再多费唇舌几下:lua调用C/C++的函数有个基本规则,该函数必须要是lua_Cfunction的格式(不知道自己查去,或者看例子中的lua_helloLua也行,反正就是这个格式)。几个比较关键的地方就是入口函数和库函数了(假使你写的是个小工具库,那么如同lua_helloLua一样,这个就算是个库函数)。例子中的入口函数为luaopen_luacall,也需要是lua_Cfunciton格式的,因为这个入口函数在lua调用的时候需要执行。另一个就是存放库函数的结构luaL_reg结构。最后一个关键的地方就是把库函数注册到lua环境中去,用的就是luaL_register函数。这些函数的用法可以去http://www.lua.org/manual/5.1/自己查询一下,我就不赘述了。

  这里的gtfunc是个luaL_reg结构的数组,需要以一个双NULL的结构作为结束标志,其他的也没啥值得注意的地方。

  C和C++由于编译不一样,因为lua是用C写的,所以在C++导出函数,要用 extern "C" 修饰,下面luaCall.h导入lua的头文件也一样:

 

 

  def文件中写上导出函数的名字

  EXPORTS

luaopen_luacall

  就可以了。

 

  下面讲最抑郁的地方,一定要注意,在windows下测试中发现的问题,我相信在linux下也差不多,不过我没去验证过。

  lua调用DLL的入口函数一定是要命名成luaopen_xxx的(这个可以参考lua.org上的文档),并且,如果使用require方式,那这个XXX一定要是这个dll的名称,在lua脚本中require时大小写敏感。也就是说,例子中,dll文件必须命名为luacall.dll,注意大小写。

  如果是用package.loadlib方式,那么导入的dll文件名可以不同。个人看来是require比较懒惰啦,呵呵。

  下面是lua中调用的demo,这里演示了dll文件名在package.loadlib中可以不同于导出函数声明:

 

  调用dll有两种方式,一种是require,一种是package.loadlib,区别是,require是默认去调用下入口函数的,而package.loadlib只是载入,需要你手动调用。

  demo中,就是默认package.loadlib的形式,下面需要显示得执行以下f(),表示调用载入的库,而如果是用require的话,直接就可以从if gt_lib then这句开始了。

  最后唠叨句,如果是用luaL_reg数组的形式,那么注册到lua中的是一个table,如果是单个结构,那么就是函数,还有就是注意lua51.dll的位置,最保险就是讲几个dll和脚本呢统统放到同一个目录下执行。自己动手试一下吧,呵呵。

抱歉!评论已关闭.