我使用wxwdigets
创建了一个类//wrapper over wxIPV4address
class IPV4addressLua : public wxIPV4address
{
public:
IPV4addressLua();
~IPV4addressLua();
bool SetService (const wxString &service);
bool SetService (unsigned short service);
unsigned short GetService () const;
wxSockAddress* GetwxSockAddress();
wxIPV4address GetwxIPV4address();
wxSocketServer* GetwxSocketServer();
};
我像这样为
输入SWIG输入的abc.i文件%module wxAppManagerLua
%{
#include "wxAppManager.h"
#include "wx/socket.h"
%}
//包装在wxIPV4address上 class IPV4addressLua //:public wxIPV4address ................... ....
然后我写make文件来生成SWIG绑定:===
TARGET= wxAppManagerLua.so
WRAPPER= wxAppManager_wrap.cxx
SRCS= $(ROOTSRC)/wxAppManager.cpp $(ROOTSRC)/XMLReader.cpp $(WRAPPER)
INTERFACE=wxAppManager.i
CC= g++
FLAGS=-shared -fPIC -DDEBUG=1
SWIGFLGS= -lua -c++ -includeall -v
RM=rm -rfv
all:$(WRAPPER)
$(TARGET) : $(SRCS)
$(CC) $(FLAGS) -o $(TARGET) $(SRCS) $(EXTRAINC) $(WXCONFIGFLGS)
$(WRAPPER):
swig $(SWIGFLGS) -I/usr/include $(EXTRAINC) $(INTERFACE)
clean:
$(RM) *.so* $(WRAPPER)
〜
...
===== 我这样生成我: -
g++ -g -shared -fPIC -o wxAppManagerLua.so ./wxAppManager_wrap.cxx ./wxAppManager/src/XMLReader.cpp ./wxAppManager/src/wxAppManager.cpp -I./ -I./wxAppManager/inc/ -I/usr/local/lib/wx/include/gtk2-ansi-debug-2.8 -I/usr/local/include/wx-2.8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D__WXDEBUG__ -D__WXGTK__ -pthread -L/usr/local/lib -pthread -lwx_gtk2d_richtext-2.8 -lwx_gtk2d_aui-2.8 -lwx_gtk2d_xrc-2.8 -lwx_gtk2d_qa-2.8 -lwx_gtk2d_html-2.8 -lwx_gtk2d_adv-2.8 -lwx_gtk2d_core-2.8 -lwx_based_xml-2.8 -lwx_based_net-2.8 -lwx_based-2.8
=====
我写这样的lua文件:
function CreateServer()
-- Create the address - defaults to localhost:0 initially
local addr = wxAppManagerLua.IPV4addressLua()
if addr ~= nil then
print(" Calling Bind Port ")
addr:SetService(3000)
end
port = addr:GetService()
print(" Binded to Port "..port)
-- Create the socket
SockAddr = wx.wxSockAddress
--CODE FAILS HERE
SOCKSERVER = wx.wxSocketServer(addr)
.... ....
我的代码在最后一行失败了......
SockTestAppMgr.wx.lua:584: wxLua: Expected a 'wxSockAddress' for parameter 1, but got a 'userdata'. Function called: 'wxSocketServer(userdata)' 01. wxSocketServer::wxSocketServer([wxSockAddress, integer]) stack traceback: [C]: in function 'wxSocketServer' SockTestAppMgr.wx.lua:584: in function 'CreateServer' SockTestAppMgr.wx.lua:682: in function 'main' SockTestAppMgr.wx.lua:694: in main chunk
===== 请注意..... wxSockAddess是wxIPV4address的基类,我从中派生了我的类。
检入此链接http://docs.wxwidgets.org/trunk/classwx_i_paddress.html
有人可以帮忙吗?
我的诊断是: -
基本问题是 每当我做sos ...使用SWIG并尝试从lua引用函数或类....它工作正常,直到我引用任何wxwidget类或函数... 甚至我的两个人都可以参考sos的课程...但不是wxwidgets clases ...... 虽然....如果我继续将任何类的wx.so引用到任何其他类的wx.so它有效...
请告诉我是什么阻止lua理解我班级的类型到任何一类wxwidgets。
我知道wxwidgets的绑定是由传统方法生成的,而不是由SWIG生成的......这会导致问题吗?
答案 0 :(得分:3)
您需要告诉SWIG如何将SWIG生成的类型转换为您尝试进行的函数调用所理解的类型。请查看SWIG用户文档的Typemap section。您应该能够提供一组类型映射,允许您将SWIG生成类型转换为非SWIG生成的wxwidget绑定所识别的类型。