软件 swigwin3 用于生成c的lua包装 lua5.2源代码
步骤 进入目录G:\sw\swigwin-3.0.12\Examples\lua\arrays 执行 SWIG -lua example.i, 就会生成文件example_wrap.c 进入lua source code G:\doc\lua\lua-5.2.4.tar\lua-5.2.4\src 拷贝swig生成的几个c文件到该目录
b编写一个新的mymain.c内容如下
执行cl编译生成example.exe
执行example.exe runme.lua
代码:
===example.i
/* File : example.i */ %module example
/* in this file there are two sorting functions and three different ways to wrap them.
See the lua code for how they are called */
%include <carrays.i> // array helpers
// this declares a batch of function for manipulating C integer arrays %array_functions(int,int)
// this adds some lua code directly into the module // warning: you need the example. prefix if you want it added into the module // admittedly this code is a bit tedious, but its a one off effort %luacode { function example.sort_int2(t) -- local len=table.maxn(t) -- the len - maxn deprecated in 5.3 local len=0; for _ in pairs(t) do len=len+1 end local arr=example.new_int(len) for i=1,len do example.int_setitem(arr,i-1,t[i]) -- note: C index is one less then lua index end example.sort_int(arr,len) -- call the fn -- copy back for i=1,len do t[i]=example.int_getitem(arr,i-1) -- note: C index is one less then lua index end example.delete_int(arr) -- must delete it end }
// this way uses the SWIG-Lua typemaps to do the conversion for us // the %apply command states to apply this wherever the argument signature matches %include <typemaps.i> %apply (double *INOUT,int) {(double* arr,int len)};
%inline %{ extern void sort_int(int* arr, int len); extern void sort_double(double* arr, int len); %}
===runme.lua
---- importing ---- if string.sub(_VERSION,1,7)=='Lua 5.0' then -- lua5.0 doesnt have a nice way to do this lib=loadlib('example.dll','luaopen_example') or loadlib('example.so','luaopen_example') assert(lib)() else -- lua 5.1 does require('example') end
-- a helper to print a Lua table function print_table(t) print(table.concat(t,",")) end
-- a helper to print a C array function print_array(arr,len) for i=0,len-1 do io.write(example.int_getitem(arr,i),",") end io.write("\n") end
math.randomseed(0) -- init random
--[[ version 1: passing a C array to the code let's test call sort_int() this requires a C array, so is the hardest to use]] ARRAY_SIZE=10 arr=example.new_int(ARRAY_SIZE) for i=0,ARRAY_SIZE-1 do example.int_setitem(arr,i,math.random(1000)) end print "unsorted" print_array(arr,ARRAY_SIZE) example.sort_int(arr,ARRAY_SIZE) print "sorted" print_array(arr,ARRAY_SIZE) example.delete_int(arr) -- must delete it print ""
--[[ version 2: using %luacode to write a helper a simpler way is to use a %luacode which is a lua function added into the module this can do the conversion for us so we can just add a lua table directly (what we do is move the lua code into the module instead) ]] t={} for i=1,ARRAY_SIZE do t[i]=math.random(1000) end print "unsorted" print_table(t) example.sort_int2(t) -- calls lua helper which then calls C print "sorted" print_table(t) print ""
--[[ version 3: use a typemap this is the best way it uses the SWIG-Lua typemaps to do the work one item of note: the typemap creates a copy, rather than edit-in-place]] t={} for i=1,ARRAY_SIZE do t[i]=math.random(1000)/10 end print "unsorted" print_table(t) t=example.sort_double(t) -- replace t with the result print "sorted" print_table(t)
===mymain.c
#include <stdio.h> #include "lua.h" #include "lualib.h" #include "lauxlib.h"
extern int luaopen_example(lua_State* L); // declare the wrapped module
int main(int argc, char* argv[]) { lua_State *L; if (argc<2) { printf("%s: <filename.lua>\n", argv[0]); return 0; } L= luaL_newstate(); luaL_openlibs(L); //luaopen_base(L); // load basic libs (eg. print) //luaopen_math(L); luaopen_example(L); // load the wrapped module if (luaL_loadfile(L, argv[1])==0) // load and run the file lua_pcall(L, 0, 0, 0); else printf("unable to load %s\n", argv[1]); lua_close(L); return 0; }
结果:
参考:
file:///G:/sw/swigwin-3.0.12/Doc/Manual/Lua.html#Lua_nn2
|
请发表评论