使用Visual Studio搭建Node C++ Addon 开发和调试环境

本文逐步讲述了如何配置Visual Studio 2017来使得能够在VS中对源生的NodeJS C++ Addon进行调试。

在开始之前,首先保证你的电脑中安装了:

1.Visual Studio 2017 (安装组件“使用C++的桌面开发”)
2.Git
3.python 2.x (用于编译node)

如果没有以上软件,请先去相关网站下载并安装。

下面开始我们的配置。

第一步 获取并编译Debug版本的Node

1.使用Git从Github获取Node源码 (此处使用cmd示例,命令为git clone https://github.com/nodejs/node)

2.切换分支到稳定版本分支(目前为v9.x) git checkout v9.x
3.使用cmd在node工作文件夹下进行build
命令为vcbuild.bat Debug x64 (32位系统请改为x86)

4.耐心等待编译完成(大概耗时约10分钟,这段时间里面可以继续第二步)

第二步 配置Visual Studio编译Node C++ Addon

1.首先创建一个空项目

2. 添加代码(此处我们用https://nodejs.org/api/addons.html上的官方hello作为示例)

添加完代码我们可以发现会有很多红色波浪的错误提示,这是因为我们还没有将所需要的头文件添加到include Path当中,接下来我们就要对其进行配置。
3.首先我们注意一下窗口上部的配置选择,默认是x86,由于我们待会使用的是64位node,所以首先要把它改成x64,将它作为活动的配置

4.然后我们选中当前的solution,然后按上边那个扳手按钮开启配置

5.在弹出的配置管理器中,首先在常规一栏,我们更改目标文件名为.node(因为这是node c++ addon的默认扩展名), 配置类型为dll动态链接库

6.接下来在左边列表中选择VC++ 目录,选择包含目录,点击右边的下拉箭头中的<编辑>
我们需要把编译node c++ addon所需的头文件文件夹加入这个目录列表中。一般来说,node c++ addon所需的目录为:

$(NODE_SRC)为第一步中下载的node源代码文件夹, 建议将其设置为环境变量,这样可以方便配置
另外如果要使用其他node内部使用的库的头文件,则都在$(NODE_SRC)\deps下面寻找,比如如果要使用libuv,就添加 $(NODE_SRC)\deps\uv\include
如果要引入其他node module的头文件(比如nan),请也手动将其目录加入这个列表中。
我们把所需要的目录添加到包含目录中如下:

7.同样是在VC++目录选项中,选择库目录(LibraryPath),把$(NODE_SRC)\Debug加入其中(此处是Debug是由于刚刚我们编译的node是Debug版本)

8.这样就完成了编译的配置,我们可以尝试进行编译。 在右边的资源管理器中点击hello.cpp,选择编译,就可以看到编译成功

如果编译失败但又确定代码正确,请仔细检查错误信息,有可能是第6步中没有完全添加所依赖的头文件,或者是由于编译器设置的检查,将警告视为错误等等。这些错误根据错误代码和信息大部分都能在网络上搜索到相关信息和解决方案,此处就不赘述了。

第三步 配置Visual Studio生成Node C++ Addon链接库(.node文件)

1.依旧是打开第二步中的解决方案配置窗口。
2.在左侧列表中选择连接器(Linker)->输入,然后点击附加依赖项进行编辑,添加node.lib
3.接下来就可以生成,点击菜单栏的生成->生成解决方案查看生成的结果。生成成功则在项目文件夹下会出现相应的.node文件

途中红框位置的路径即为生成的路径

第四步 配置Visual Studio调试.node链接库

1.为了调试我们的生成的.node,首先需要有可以运行的js文件,仍然以node官方文档hello中提供的js为例子
我们在工程文件目录下hello.js

2.依旧是如第二步中打开项目配置,这次选择左边的调试选项:
修改命令为$(NODE_SRC)/Debug/node.exe
修改命令参数为$(SolutionDir)hello.js

3.确定后点击运行,配合设置的断点,就可以开始调试啦!

4.有的时候我们可能会使用类似child_process.fork创建子进程,如果需要调试子进程中的源生addon,或者是调试已经在运行的进程,我们可以选择上方菜单的调试->附加到进程来使得调试器对这个进程进行调试。

以上就是配置visual studio对node c++ addon进行编译,调试,生成的方法,希望对有需要的人有所帮助。

发表评论