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文件,代码分别如下:
2.3 编译形成DLL
直接编译即可形成DLL文件。在项目目录下的BIN/DEBUG下会形成DLL。
3 LUA调用DLL
3.1 编写测试脚本dlltest.lua
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函数注册的时候,需要注意库文件的命名。
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函数注册的时候,需要注意库文件的命名。