Lua C模块开发

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

猜你喜欢

转载自lobin.iteye.com/blog/2435794