本文算是对[[[[[[[[[[[[[[[[[@blackfog](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)](/user/blackfog)的文章http://cnodejs.org/topic/4f71e3688a04d82a3d264b5a#527dd970d2b3893f2a11a5ca的心得吧。
本来人家官方文档上给的例子是用node-gyp来编译的,我想既然有这么强大的工具为何还要自己编译源码呢,于是乎我就按照了node-gyp。怀着兴奋的心情运行了一下helloworld,发现报错了,而且错误信息提示我这可能是node-gyp的一个bug,让我更新一下node-gyp试试。我更新了一下,发现我用的就是最新版。我只好老老实实的去github上给他们发bug提示(可以从这里找到我发的bug:https://github.com/TooTallNate/node-gyp/issues/345),话说都发了快一周了,为啥他们的作者都不理我呢?
算了还是自己编译源码吧,话说楼主用的是vs2010编译,我想到自己电脑上装的是vs2012,比2010版本还要高呢,应该没有问题吧。于是乎我在源码文件夹下运行了vcbuild.bat release
,结果遇到了一大堆错误,全部告诉我winsock2.h找不到。我好端端的一个windows系统,怎么连这么常见的一个头文件也找不着?我搜了一遍自己的c盘,又搜了一遍vs的安装目录,果然没有找到。那就只好在网上搜一下原因了,有网友提示说安装一下windows sdk头文件就找到了,但是我又发现vs2012是自带sdk的啊,怎么可能是没装sdk产生的问题呢?
然后接下来就是各种尝试,各种失败,最终抱着试试看的态度,我又重新下载了一遍windows sdk,安装上,发现这玩意只能安装在c盘(你说微软这是咋想的,为啥不能安装在其他盘),而且是将自己原来安装的sdk给覆盖掉了,心想这下子很可能又是白费工夫。但是我在安装完的sdk目录就然搜到了winsock2.h,我晕,合着之前装的那个sdk是个残次品。接着我编译了一下node的源码,发现编译通过了!
接下来就是编译node扩展了,这时我还是选择的vs2012。打开vs2012后,选择新建项目,我发现了一个创建dll项目的现象,不过其后面有一个括号标明是windwos应用商店程序。新建后发现引入了一堆用不到的文件,心想既然用不到就干脆将其删除了,没想到编译的时候提示预编译头文件pch.h文件找不到,然后就是大堆错误,网上有提示说在项目属性->c/c++/->预编译中设置不使用预编译,结果还是不行。
心想是不是vs就不能用呢?于是我打起了其他ide的主意,首先尝试cfree,将头文件、库文件全部配置好,结果提示node.lib找不到,我明明写的是绝对路径,它竟然说找不到,失败。然后尝试code::blocks,google各种codeblocks的资料后,我设置好了头文件、库文件,首先使用自带的mingw进行编译,结果被提示node.h 192行中有一个警告:warning ‘dllimport’ attribute ignored - attributes,然后就是各种函数undefined,失败。接着尝试cygwin进行编译,结果提示“uv-unix.h|148|error: ‘pthread_barrier_t’ does not name a type”,google一下发现node根本就不支持cygwin进行编译(https://github.com/joyent/libuv/issues/845),失败。
无奈之下,我最剩下最后一招,下载vs2010,安装完成后,我发现2010中也没有新建dll的选项啊,算了还是新建空项目吧,然后建完之后,在配置属性->常规->配置类型中修改为动态库类型。然后按照楼主的说明修改了一下头文件和库文件的配置,运行一下生成,编译通过了!
接下来就是测试编译成功后的生成文件了,按照楼主的示例写了一个测试文件,一运行,发现node抛出异常了,“Error: %1 is not a valid Win32 application.”,难道我又失败了?不死心啊,我用google,发现这个问题很好解决,stackoverflow上已经有人解决这个问题了(地址:http://stackoverflow.com/questions/13035760/node-js-native-module-is-not-a-valid-win32-application-error)。究其原因是因为,自己的电脑之前已经通过安装包安装过node,且将其加入环境变量了,运行node的时候就是调用环境变量中的node,然而这个和编译生成的node扩展是不兼容的。运行的时候使用编译生成的node程序,最后成功!
接着说一下刚才vs2012的问题,现在用vs2012重新打开vs2010创建的项目,编译一下,同样是成功的,看来编译node扩展项目正确的途径应该是新建一个空白项目,然后将其的配置类型改成动态库类型,然后配置一下头文件和库文件就可以了。并不是vs2012不能用,而是用的方法不对。