您的位置:首页 > 编程语言 > Lua

window下LUA调用C函数(动态库)

2012-02-11 22:05 387 查看
DESC:WIN7下 LUA调用C动态库

Author:dingwood

Date:2012-02-11 21:34

1 概述

本文主要描述在WINDOW系统下LUA如何调用C语言提供的函数(以dll动态库的方式进行提供)。使用的开发工具为CODE BLOCKS 10.1 (以下简称CB),思路很简单,先用CODEBLOCKS形成DLL动态库,然后在LUA FOR WINDOWS 的界面里通过dofile调用脚本或直接编写脚本进行测试。

2 制作DLL

2.1 新建DLL项目

打开CB,按如下顺序新建DLL项目:FILEàNEWàPORJECT-->DYNAMIC LINK LIBRARY àGO,然后NEXT,输入project title ,然后NEXT,最后FINISH.

2.2 编写代码

新建项目后会有,SOURCE和HEADER目录下会自动生成如下CPP文件

和头文件删除了,然后新建.c和.h文件,代码分别如下:

/*     -------------------------------.c头文件内容------------------------------*/

#include "lua.h"

#include "lualib.h"

#include "lauxlib.h"

#include <stdio.h>

/*----------定义函数--------------*/

//调用函数返回test字符串

static int dll_helloworld(lua_State* L)

{

char * presult  = "test";

lua_pushlstring(L, presult,4);

//把test作为返回结果入栈,然后打印一个字符串。

printf("this is mytestlualib's hello world !\n");

return 1;

};

//获取栈中的值个数,并计算出栈的所有元素的个数之和。并计算出平均数和总和,然后放入栈中。

static int dll_avager(lua_State *L)

{

/* get number of arguments */

int n = lua_gettop(L);

double sum = 0;

int i;

/* loop through each argument */

for (i = 1; i <= n; i++)

{

/* total the arguments */

sum += lua_tonumber(L, i);

}

/* push the average */

lua_pushnumber(L, sum / n);

/* push the sum */

lua_pushnumber(L, sum);

/* return the number of results */

return 2;

//返回书目即为返回结果的个数

};

/*-----------注册函数-------注意,最后需要为NULL,NULL-*/

static const luaL_reg  mytestlualib[] =

{

{"HelloWorld",dll_helloworld},

{"average",dll_avager},

{NULL, NULL}

};

/*

** Open string library

**注意luaL_register后两个参数的格式,最后一个参数以lib结尾,且名字和注册函数中的名字一致。

*/

int    luaopen_mytestlua(lua_State *L) {

luaL_register(L, "mytestlua", mytestlualib);

return 1;

};

/* -------------------------------.h头文件内容------------------------------*/

static int dll_helloworld(lua_State* L);

static int dll_avager(lua_State *L);


2.3 编译形成DLL

直接编译即可形成DLL文件。在项目目录下的BIN/DEBUG下会形成DLL。

3 LUA调用DLL

3.1 编写测试脚本dlltest.lua

print("begin loading package.....");

local testlib = package.loadlib("D://lua//ctest//20120211stringutil//bin//Debug//20120211stringutil.dll","luaopen_mytestlua");

print (testlib)

if(testlib)then

testlib();

else

print("error");

end

--调用helloworld函数,将返回test字符。

local testinfo  = mytestlua.HelloWorld("hell","woll","test");

print("testinfo .."..testinfo);

--调用avaerage函数,求出是三个数的平均数及和并打印。

a,b=mytestlua.average(23,33,3344);

print("average:"..a.."|sum:"..b);


3.2 测试结果

打开lua for windows 的终端界面,输入以下内容

>dofile(“d://dlltest.lua”)

然后查看返回结果 ,其中3.1编写的dlltest.lua在D盘根目录下。

4 注意

4.1 UE编辑脚本

在编辑LUA测试脚本的时候,需要注意,尽量用记事本编辑,因为UE编辑脚本的时候会牵涉到BOM的问题,导致lua无法解析脚本文件。

4.2 命名问题

在编写C函数注册的时候,需要注意库文件的命名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: