wxLua 扩展

来源:互联网 发布:linux 查看nginx配置 编辑:程序博客网 时间:2024/05/01 06:15

目标:使用脚本,实现GUI可配置

支持:wxWidgets, LUA, wxLua, MinGW, Bakefile

平台:Windows

版本:Lua5.1, wxWidgets2.8.xx,GCC4.5.0

 

1.环境搭建

1.1下载MinGW

    http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst-20101030/mingw-get-inst-20101030.exe/download

   安装到%MinGW%, 添加路径%MinGW%/bin至环境变量path中。可以把%MinGW%/bin中的mingw32-make.exe 拷贝一份并改名为make.exe, 以后就可以直接使用make命令了。

 

    -shared 编译dll,例如

    gcc -shared -o mydll.dll mydll.o mydll.def -Wl,--out-implib,libmydll.a

    -Wl为链接参数,以上表示输出一个导入库文件libmydll.a

    注意C语言格式函数在DEF中输出,声明应该加extern "C"

    --enable-auto-import可以找到正确的C++函数名, 通常加上-Wl,--enable-auto-import,少一堆的提示

    bkl文件中可以把DEF文件写在ldflags标签中,如<ldflags>$(SRCDIR)$(DIRSEP)xxx.def</ldflags>
 

1.2下载一份LUA源代码

    用mingw32-make编译之。

    下载到目录%LUA%, 进入%LUA%/src目录,建立一个批处理文本make-mingw32.bat,内容如下

mingw32-make -f Makefile mingw

    执行之,编译。详细可参阅%LUA%/README。

 

1.3 wxWidgets编译

   下载wxWidgets, 安装到%WXWIN%, 进入%WXWIN%/build/msw, 建立一个批处理文本make-mingw32.bat,内容如下

mingw32-make.exe -f makefile.gcc BUILD=release SHARED=1 UNICODE=0 USE_OPENGL=1 COMSPEC=%comspec%

   执行之,编译。

   组件选择可修改%WXWIN%/include/wx/msw/setup.h

  有可能需要打个patch, 下载xxx.patch, 使用cygwin\bin\patch.exe打上这些补丁,命令大致是

  patch.exe p0 < xxx.patch

 

   STC编译

   进行目录%WXWIN%/contrib/build/stc,建立一个批处理文本make-mingw32.bat, 内容如下

mingw32-make -f makefile.gcc BUILD=release SHARED=1 UNICODE=0 WX_SHARED=1 COMSPEC=%comspec%

   执行之,编译。

 

 

1.4 wxLua编译

   下载wxLua,安装到%WXLUA%,进入%WXLUA%/build/msw,建立一个批处理文件make-mingw32.bat,内容如下

mingw32-make -f makefile.gcc BUILD=release SHARED=1 UNICODE=0 WX_SHARED=1 LINK_DLL_FLAGS="-shared" LINK_MODULE_FLAGS="-shared" COMSPEC=%comspec%

 

    执行之,编译。

    如果传递参数USE_SYSTEM_LUA=1,那么wxLua就不会编译自带的LUA,如果已经独立下载编译了LUA,可以使用这样参数。比较郁闷的是wxLua自带的LUA是编译成lua5.1.dll,与其他的环境如LFW和LUA自身的不一样,它们是编译成lua51.dll,所以wxLua编译起来有点麻烦。而且wxLua自带的LUA也没编译一个可执行文件出来, 要是有就直接可用它做LUA环境。如果实在搞不定,把lua5.1.dll和lua51.dll一起带上。也可以修改一下wxLua里面关于LUA的编译,在生成DLL之后加上一段生成.exe,这样就让wxLua彻底地包含了LUA。修改makefile.gcc如下

...

ifeq ($(SHARED),1)
ifeq ($(USE_SYSTEM_LUA),0)
../../../lib/gcc_$(VAR_140)/lua5.1.dll: make_dir_lua_dll  $(LUA_DLL_OBJECTS)
 $(CC) $(LINK_DLL_FLAGS) -fPIC -o $@ $(LUA_DLL_OBJECTS) $(LDFLAGS) $(VAR_144) -Wl,--out-implib=../../../lib/gcc_$(VAR_140)/liblua5.1.a
 @echo modify by loon.x
 @echo create lua.exe...
 $(CC) -o ../../../lib/gcc_$(VAR_140)/lua.exe ../../../modules/lua/src/lua.c -L../../../lib/gcc_$(VAR_140) -llua5.1
endif
endif

...

    各个程序点的版本要一致,编译的选择也要一致。

 

 

 

    参考:http://wxlua.sourceforge.net/docs/install.html

 

 1.5 Bakefile

    从http://www.bakefile.org/wiki/UserExtensions 下载dll-def-file.bkl(需要输出函数如luaopen_xxx)。这个好像有问题,因为--disable-auto-import后会有一大堆的函数找不到(名称对不上,如果纯C就不会有名字问题)而导致编译失败。可能以后更深刻理解各个编译过程也许会有不同的看法。目前并没有用到它,而是直接加ldflags标签内容。

    从http://www.bakefile.org/attachment/ticket/236/bakefile_gen_envvars.patch下载一个bakefile_gen不能展开环境变量的补丁文件。用cygwin的命令patch将这个补丁打上去,在bakefile的安装目录下执行行命令

patch -p0 -i bakefile_gen_envvars.patch

 

2.hello world

    编写一个wxWidgets的控件,用wxBind包装,由Lua调用。

21.代码

http://wlmmlw.download.csdn.net/ 

效果图

控件响应消息

 

这样的helloworld是不是有点累人。