nodejs以轻量化、高效为特点日益深入我心。但在nodejs 0.10下没有在原生的数据库。最近在考虑实现数据持久化时准备使用数据库,初步准备使用sqlite。
nodejs下sqlite库。可以使用npm install node-sqlite安装。但在windows下无法安装。顺便说下,有的人说nodejs是在linux下用的,windows下可以不用考虑。但你要知道,windows下用户是最多,什么时候我们也不能把最多数的用户忘了。查找下相关资料,无法安装是因为没有node-sqlite的windows二进制安装文件,安装时需要编译。在这里描述了如何在windows下编译node-sqlite。但在实际上感觉还是有许多不同。这里记录下来,给后来的各位借鉴下。
首先要安装vc express,它是编译器,没有它就没法编译了。我下载的是2010版。安装方式有两种,一种是网络安装,从这里下载运行后,会下载真正的安装文件,大概要1个多小时。还可以离线安装版,在这里,大约1G多。这个是express的合集,可有选择地安。
然后在这里下载node的编译版,注意不是安装版。然后运行里面的vcbuild.bat,生成可链接版。
在这里下载node-sqlite的windows版。这一版本里没有gyp,所以不能直接编译。需要人工通过express 2010界面的方式编译。
首先将deps下的sqlite-autoconf-3070800.tar.gz文件解压到sqlite3下。
然后设定参数。设定参数可以两种方式,一种直接编辑node_extension.SAMPLE.props,然后改名为node_extension.props。一种是将node_extension.SAMPLE.props直接改名为node_extension.props。然后打开node-sqlite3.sln。在node-sqlite3的属性页中,修改c/c++/常规/附加包含目录,把包含node.h的目录添加上。node.h不知道在哪里?下载的node编译版里有,在node下的\src\里。下面是和说明不一样的。还要添加,uv.h和v8.h,分别在node下的\deps\uv\include和\deps\v8\include。在node-sqlite3的属性页中,链接器/常规/附加库目录中添加node.lib的目录。
最后开始build。然后会一大堆错误:
1>d:\sqlite-win\node-sqlite3-windows\src\statement.cc(121): error C2664: “uv_queue_work”: 不能将参数 4 从“void (__cdecl *)(uv_work_t *)”转换为“uv_after_work_cb”
1> 在匹配目标类型的范围内没有具有该名称的函数
这样的可以将&baton->request, Work_Prepare, Work_AfterPrepare改为&baton->request, Work_Prepare, (uv_after_work_cb)Work_AfterPrepare
还有要将macros.h中的&baton->request, Work_##type, Work_After##type)改为&baton->request, Work_##type, (uv_after_work_cb)Work_After##type)
但在链接时还会出现错误:
1>------ 已启动生成: 项目: node_sqlite3, 配置: Debug Win32 ------
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(299,5): warning MSB8004: Output 目录未以斜杠结尾。此生成实例将添加斜杠,因为必须有这个斜杠才能正确计算 Output 目录。
1> 正在创建库 D:\sqlite-win\node-sqlite3-windows\\lib\node_sqlite3.lib 和对象 D:\sqlite-win\node-sqlite3-windows\\lib\node_sqlite3.exp
1>database.obj : error LNK2001: 无法解析的外部符号 "class v8::Isolate * node::node_isolate" (?node_isolate@node@@3PAVIsolate@v8@@A)
1>statement.obj : error LNK2001: 无法解析的外部符号 "class v8::Isolate * node::node_isolate" (?node_isolate@node@@3PAVIsolate@v8@@A)
1>D:\sqlite-win\node-sqlite3-windows\\lib\node_sqlite3.node : fatal error LNK1120: 1 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
我估计是链接时的错误,查找下相关文件,在node.cc中"class v8::Isolate * node::node_isolate"有定义: