Lua C模块开发
iarray例子
例子工程文件列表:
>tree . /F
卷 D 的文件夹 PATH 列表
卷序列号为 F075-351A
D:\***\ALLOC
alloc.cpp
alloc.obj
iarray.dll
iarray.exp
iarray.lib
liballoc.cpp
liballoc.obj
Makefile
没有子文件夹
alloc.cpp
#pragma comment(lib, "lua5.1.lib") extern "C" { #include <lua.h> #include <lualib.h> #include <lauxlib.h> }; typedef struct { int size; int *data; } array_it; _declspec(dllexport) int i_array_new(lua_State *L) { int n = luaL_checkint(L, 1); size_t nbytes = sizeof(array_it) + (n - 1) * sizeof(int); array_it *i = (array_it *) lua_newuserdata(L, nbytes); i->size = n; printf("%dbytes allocated.\n", nbytes); return 1; } static const luaL_Reg iarray[]= { {"new",i_array_new}, {NULL, NULL} }; extern "C" _declspec(dllexport) int luaopen_iarray(lua_State *L) { luaL_openlib(L, "iarray", iarray, 0); return 1; }
liballoc.cpp
#include <windows.h> BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; }
Makefile
VC_PATH=D:\*** CL="$(VC_PATH)\Bin\cl.exe" LINK="$(VC_PATH)\Bin\link.exe" INCLUDE="$(VC_PATH)\Include" LIB="$(VC_PATH)\Lib" LUA_PATH=D:\***\5.1 INCLUDE_LUA="$(LUA_PATH)\include" LIB_LUA="$(LUA_PATH)\lib" # DEBUG=. BUILD: $(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LUA) /c /Fo$(DEBUG)/ *.cpp $(LINK) /DLL /LIBPATH:$(LIB) /LIBPATH:$(LIB_LUA) /OUT:$(DEBUG)/iarray.dll $(DEBUG)/*.obj
编译链接生产动态链接库:
>nmake ... alloc.cpp liballoc.cpp Generating Code... ... Creating library ./iarray.lib and object ./iarray.exp
将动态链接库iarray.dll拷贝到<LUA_HOME>\clibs目录下:
>cp -rf iarray.dll D:\***\clibs
>lua
> iarray = require("iarray") > print(iarray) table: 003CD908 > a = iarray.new(10) 44bytes allocated. > print(a) userdata: 003CDD90