代码改变世界

cocos2dx 3.17(Windows下) 接入skynet和sprotol

2019-05-10 09:04  撞破南墙  阅读(1326)  评论(0编辑  收藏  举报

大致流程一致,但是他的github上的版本,没有Windows的版本。打开他的win的工程会提示缺少一个模块。
本人环境

  • cocos2dx 3.17.1 当前最新
  • skynet-无视-当前最新
  • VS2015(机器上同时装了多个VS)
  • WIN7
  • PYTHON 2.7.9
  1. cocos的下载地址,下载的稳定版
    Cocos2d-x stable versions
    http://www.cocos2d-x.org/download

  2. 安装python,一定要是python2.x的
    设置好环境变量就行
    CMD-》python -V 查看确认版本
    2.7.X

  3. 然后运行Cocos2dx3.17里面的setup.py开工。。
    因为我只在WIN下跑,所以enter就行。这些ndk、sdk、ant都是要下载的通通不用设置路径。

  4. 环境配置好后重启一波就能创建工程了
    我找的一个脚本

@echo off
set /p projectName=please input project name:
set /p packageName=please input package name:
@echo cocos new %projectName% -p %packageName% -l lua -d C:\demo1
cocos new %projectName% -p %packageName% -l lua -d C:\demo1
@echo Create Success!!!
  1. 再然后就是进目录打开VS工程。
  2. 巨坑马上就来了。

首先, 添加framework/cocos2d-x/external/lua/文件夹下

/bitop /lpack /lpeg /sproto

然后在lua_extension.c中添加些,东西,我直接把整个文件贴来了

#include "scripting/lua-bindings/manual/network/lua_extensions.h"

#if __cplusplus
extern "C" {
#endif
// socket
#include "luasocket/luasocket.h"
#include "luasocket/luasocket_scripts.h"
#include "luasocket/mime.h"

// srpotol
#include "sproto/lsproto.h"
#if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
#include "bitop/bit.h"
#endif
#include "lpeg/lpeg.h"
#include "lpack/lpack.h"

static luaL_Reg luax_exts[] = {
    {"socket.core", luaopen_socket_core},
    {"mime.core", luaopen_mime_core},
	//add 
	{ "sproto.core", luaopen_sproto_core },
#if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID)
	{ "bit", luaopen_bit },
#endif
	{ "lpeg", luaopen_lpeg },
	{ "string", luaopen_pack },	
	//add end 
    {NULL, NULL}
};

void luaopen_lua_extensions(lua_State *L)
{
    // load extensions
    luaL_Reg* lib = luax_exts;
    lua_getglobal(L, "package");
    lua_getfield(L, -1, "preload");
    for (; lib->func; lib++)
    {
        lua_pushcfunction(L, lib->func);
        lua_setfield(L, -2, lib->name);
    }
    lua_pop(L, 2);

    luaopen_luasocket_scripts(L);
}

#if __cplusplus
} // extern "C"
#endif
  1. VS中在libluacocos2d目录里面建立对应的链接器(文件夹),把他们包含进来,
    /bitop /lpack /lpeg /sproto 这4个。

  2. 开始编译。。。。麻吉报错

错误(活动) 未定义标识符 "luaL_reg" libluacocos2d

真香分析后,发现这东西明明就在对应的luajit文件夹下面的头文件里面,
经过一番挣扎,我发现。。我只是把这个类型的定义复制过来,编译一次,他提示不能重复定义,再注释就PASS了。

//typedef struct luaL_Reg {
//	const char *name;
//	lua_CFunction func;
//} luaL_Reg;

static const luaL_Reg R[] =
{
	{ "pack",    l_pack },
	{ "unpack",  l_unpack },
	{ NULL,  NULL }
};
  1. 继续编译 报错

LNK2019 无法解析的外部符号 _luaL_setfuncs

真香分析后发现,这个是5.2的API,在lsprotol.c中,将
这么一改就行。。。本来就是要用LUAJIT的。

//#ifndef luaL_newlib /* using LuaJIT */
#ifdef luaL_newlib /* using LuaJIT */

理论上来5.1的lua就支持5.2的一些用法了。

  1. 把他的SRC复制过来 你的里面就能在window里面跑了。
    https://github.com/ZhaoTop/CCSkynet/tree/master/TestSproto

理论上就OK了。收工。

参考
https://blog.csdn.net/qq_34497362/article/details/81780342
https://blog.csdn.net/lvyan1994/article/details/83578326