使用Swig构建RakNet C#Wrapper,在构建时遇到恼人的错误

时间:2015-02-23 17:39:30

标签: c++ wrapper swig raknet

我知道我应该在官方的RakNet论坛上发布这个帖子,但我确实有,但它似乎已经死了。

我在这里问的原因是因为我不知道C ++,我是一名游戏开发者,我们正在使用Unity3D / C#来开发我们的新游戏,它将是多人游戏,而RakNet是Open来源我想尝试一下。

所以,我们走了,这是错误日志:

raknet_wrap.cxx(15441):错误C2558:类'RakNet :: ReliabilityLayer':没有可用的复制构造函数或复制构造函数被声明为'explicit'

错误的行是:

jresult = new ReliabilityLayer((const ReliabilityLayer &)result); 

全功能:

SWIGEXPORT void * SWIGSTDCALL CSharp_RakPeer_RemoteSystemStruct_reliabilityLayer_get(void * jarg1) {
  void * jresult ;
  RakNet::RakPeer::RemoteSystemStruct *arg1 = (RakNet::RakPeer::RemoteSystemStruct *) 0 ;
  ReliabilityLayer result;

  arg1 = (RakNet::RakPeer::RemoteSystemStruct *)jarg1; 
  result =  ((arg1)->reliabilityLayer);
  jresult = new ReliabilityLayer((const ReliabilityLayer &)result); 
  return jresult;
}

有人可以告诉我为什么它不起作用并为一个全新的C ++解释它所以我能理解错误吗?

(编辑)还要提供ReliabilityLayer类!这是:http://pastebin.com/qTXedJFw

2 个答案:

答案 0 :(得分:0)

所以我终于设法构建了最新RakNet版本的RakNet C#DLL。

而且,由于我不希望任何没有C ++经验的人经历我所经历的疯狂,我只是为了方便使用而共享DLL。只需将其导入您的项目并开始使用它。

这是:https://drive.google.com/file/d/0BwuOJwLuDZfnM29DTFlLTWZWOXc/view?usp=sharing

答案 1 :(得分:0)

对于正在观看此节目并且没有成功答案的人,可以。

这显然是MSVC 2013中的一个编译器错误(这就是我的尝试)。

SWIG使用以下行生成文件'RakNet_wrap.cxx':

jresult = new ReliabilityLayer((const ReliabilityLayer &)result); 

最快的方法是编辑这一行,使其显示为:

jresult = new ReliabilityLayer(result); 

因此,转换变为隐式而非显式,MSVC 2013接受此。

唯一的问题是,当您点击Build时,SWIG将覆盖此文件并再次引入错误。因此,只需删除SWIG预建步骤(Alt + F7->构建事件 - >预构建事件从命令行中删除PreBuild.bat)并再次构建。现在它将成功编译和链接。

如果您需要修改源代码并再次运行SWIG,请不要忘记再次放置PreBuild.bat文件!

也使用SWIG 2.0.12;我试过的最新版本(3.0.5);生成损坏的C#代码(未定义的HandleRef和IntPtr,因为System.Runtime.InteropServices既不是显式的,也不是通过'using'关键字导入的)。 我已经向SWIG项目提出了一个关于此问题的门票:https://github.com/swig/swig/issues/433