首先说明一下环境
cocos2d-x v3.2
为什么要用这个版本,是因为在项目开始决策的时候我并未处在客户端决策层,因为我是搞服务器的,所以后来只能继续沿用这个版本,至少这个项目是的
Windows 7 64位 Visual Studio 2013
这个开发环境,经过这个需求的考验,让我越来越失望
这里说明一下需求
很简单的程序,不多说,需要有个配置管理的模块,譬如你进行多少关,现在多少级,数据不多不少,总不能自己定配置文件格式,解析等等,用userdefalut吧,太不成熟的一个东西,虽然用过,但这一次还是想尝试一下新东西,Sqlite轻量型数据库。
请耐心一步一步的看我的经历,或许以后就节省你若干时间,再或许这里就有你问题的解决方案
需求很明确了,我总是要在lua层操作Sqlite的,这点有开源的模块:http://lua.sqlite.org/index.cgi/index
做程序要熟悉一个开源项目,肯定要从说明文档入手啦,它在它的说明文档里在安装一栏提到了这点
Luarocks (http://luarocks.org/) is the preferred mechanism to build and install lsqlite3; it assumes an SQLite3 library is already installed.
大致意思就是它推荐你用Luarocks安装lsqlite3,注意哦,这个名字也坑了我好长时间的,后面再说
这里就只能开始再硬着头皮学Luarocks,目前我对它的理解是,它就是一个管理Lua开源模块的工具,可以用它快速安装开源模块,譬如我用Lua封装了网络模块,提交到Luarocks,这样别人就可以快速的下载安装到他的操作系统中,甚至项目中都不必引入之类的操作,但是这点在Windows上真的是不完善的,而且即便是后来我也是不怎么会,我的作法是,把Luarocks编译好的dll文件直接放到我的项目可执行文件的同级目录,mac中会好些安装的文件直接就装在了环境变量存在的目录,不管怎样看着他的说明文档Luarocks总能很快的装到自己的操作系统中。
之后就可以通过Luarocks提供的命令安装lsqlite3啦,关于那个命名坑,我这里要说一下,你如果通过这个命令安装:luarocks install luasql-sqlite3 你就大错特错了,你应该通过这个命令安装,luarocks install lsqlite3这才是你真正需要的东西。关于名称坑在那里你们体会一下吧。
安装过程在Windows上需要指定Sqlite_dir Sqlite_incdir,根据名称的意思指定正确的目录就好了,这样需求也需要你自己通过Sqlite3官网下载的东西编译一份静态库。方法就不详细说了。若是这一步在Mac上是不需要制定库目录的,实践告诉我的,呵呵。这里还要提一下,你会看到cocos有编好的sqlite3库文件,及头文件,在xxx\frameworks\cocos2d-x\external\sqlite3,最好不要用那个,因为你lsqlite3下载的是最新版本的,你的sqlite3却不用最新版本,编译过程会报一个错的,这个错很难让你想到是因为版本不匹配而造成的。
即便你通过了上面的所有磨砺,你依然会在最后一步,止步不前。因为你要打包了,你有dll文件,你也有so文件,但那都是通过操作系统使用的,手机能用不能呢,实践告诉我,即使我把so文件当做资源打包到android上,路径不错的情况下,我还是无法使用它,过多的尝试和朋友的话,就让我前面的努力都夭折了,你的动态库是用gcc编译的,即便你手机程序能加载,也用不了,必须用NDK编译,不管怎样的方法,这一步是少不了的。
其实要想在项目里支持操作Sqlite,原没有那么麻烦,现在我就把现在用的方法再说一遍
首先你要先看这篇文章:http://blog.csdn.net/costa100/article/details/20050561
它加密相关的操作,你暂时可以先忽略,主体操作都是大同小异,我在这里写上我的详细做法
因为版本的原因,请在项目目录xxx\frameworks\cocos2d-x\external\lua里创建lsqlite3目录
解压(分别都是在官网下载的最新版本)
lsqlite3_fsl09w.zip
sqlite-amalgamation-201507231639.zip
将解压出来的源文件和头文件
sqlite3ext.h
sqlite3.h
sqlite3.c
lsqlite3.c
拷贝到文件夹中
在目录中新建lsqlite3.h头文件
#ifndef __LSQLITE3_H__
#define __LSQLITE3_H__
#include "lauxlib.h"
LUALIB_API int luaopen_lsqlite3(lua_State *L);
#endif
修改lsqlite3.c文件增加如下两行,包含刚才新建的头文件及sqlite3的头文件
#include "lsqlite3.h"
#include "sqlite3.h"
修改xxx\frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\lua_extensions.c文件,修改如下
#include "luasocket/luasocket.h"
#include "luasocket/mime.h"
#include "lsqlite3/lsqlite3.h"
static luaL_Reg luax_exts[] = {
{"socket.core", luaopen_socket_core},
{"mime.core", luaopen_mime_core},
{"lsqlite3", luaopen_lsqlite3},
{NULL, NULL}
};
在VS2013中打开解决方案,找到liblua项目,新建lsqlite筛选器,里面添加-现有项,把新建目录lsqlite3中的头文件及源文件均添加进去,生成项目,应该不会存在问题,其实若是不打包及跨平台的话(怎么可能)你还可以这样操作,你就不用下载sqlite3了,直接用cocos2dx提供的sqlite3版本,xxx\frameworks\cocos2d-x\external\sqlite3,这样就要求你在lsqlite3.cpp中包含sqlite3.h的目录要改一下,这时,你的liblua项目就可以仅添加lsqlite3.h和lsqlite3.cpp文件啦,这样liblua是可以编译通过的,但是编我们项目的时候会报sqlite3的函数未定义,一看就是缺少库引用。就把我们的项目中添加库引用。这样程序就能正常编译啦
这个时候若是打包呢,我android包习惯用cocos compile方法,首先说明的是如果用上面第二个方案,打包肯定是很困难的,至少我没有方案,因为我不知道该如何方便的在android.mk引入sqlite3的动态链接库,即便是引入我想后面应该也有很多坑吧,所以一开始把sqlite3编到自己项目里总是明智的,当命令行编译的时候,肯定会报错,因为你还没有把你新增的源文件添加到android.mk中呢,添加后就应该不会有什么大问题了吧。
../../../external/lua/lsqlite3/lsqlite3.c \
../../../external/lua/lsqlite3/sqlite3.c \
我的总结性文章一般都是事后写,这样我有时可能仅关注了关键性操作,一些小问题,百度一下,思考一下解决的东西,我可能都不怎么写了,因为已经忘记了,望见谅