整整弄了两天,踩了无数的坑,各种奇怪的error,最后终于编译成功了。

  网上的教程基本上都过时了,或者是版本不对,都会报一些奇怪的错误,这里总结一下目前可行的流程。

  node版本:v10.1.0。

  首先需要一些准备工作:

1、Visual Studio 2017 传送门:https://www.visualstudio.com/zh-hans/downloads/

2、python2.7 传送门:https://www.python.org/downloads/release/python-2715/

3、NASM 传送门:https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/win64/

4、Git bash 传送门:https://git-scm.com/downloads

  全部安装完,然后记得给python与NASM添加环境变量。

  

  接下来就是把node的源码给down下来,传送门:https://nodejs.org/en/download/current/

  这个LTS还是current自己选,反正点那个下载源码的按钮:

  把东西弄下来解压到一个地方,然后双击文件夹里面的vcbuild.bat:

  可以在这个批处理文件打个断点,可以发现输出信息如下:

  脚本的开始都是在检测是否有预装对应的工具,然后调用其余的批处理文件进行编译。

  这个时间会比较长,可以先去吃个饭。你会发现文件夹在逐渐变大,最后大概有个20G……

  编译完成后,文件夹会有一个node.sln,在VS2017中选择文件-打开-项目/解决方案,双击这个文件,会把node项目给引到IDE中去。

  这时如果直接点击开始调试,可能会出现以下问题:

  这是因为项目的默认启动项设成了目录的第一个,右键解决方案,点击设置自动项目:

  选择单启动项目,把那个cares改成node:

  这样就可以开始启动node项目,时间非常的长……

  这时候再次点击开始调试,可能又会出现以下错误:

  这个弹窗其实是个幌子,真正的错误是控制台报错,这个Debug是一个类似于webpack打包的环境变量,有Debug和Release两种,设置地点在IDE的菜单下面:

  而这个文件确实找不到,但是我在Release里面发现了node.exe与那个失踪的openssl.def。

  解决办法就是把Release文件夹里的复制到Debug文件夹中去,然后再次尝试应该就成了,当然,如果把环境变量换成Release也是OK的。

  再再次点击开始调试,又是一段非常长的时间,最后成功的话,理论上是会弹出一个node的REPL窗口,就是平时在cmd里面输入node指令的样子,如下:

  检测一下是否读取的是本地的代码,打开node_main.cc,添加一个log代码:

  这次不点调试,太久了,点那个开始执行(不调试),可以到输出如下:

  至此,已经可以对nodejs的源码打log了,源码之路的基石已经铺好。

  不知道有没有类似于热重载的功能,这C++启动一次实在是太久了。

深入出不来nodejs源码-编译启动(1)的更多相关文章

  1. 深入出不来nodejs源码-V8引擎初探

    原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下 ...

  2. 深入出不来nodejs源码-timer模块(JS篇)

    鸽了好久,最近沉迷游戏,继续写点什么吧,也不知道有没有人看. 其实这个node的源码也不知道该怎么写了,很多模块涉及的东西比较深,JS和C++两头看,中间被工作耽搁回来就一脸懵逼了,所以还是挑一些简单 ...

  3. 深入出不来nodejs源码-从fs.stat方法来看node架构

    node的源码分析还挺多的,不过像我这样愣头完全平铺源码做解析的貌似还没有,所以开个先例,从一个API来了解node的调用链. 首先上一张整体的图,网上翻到的,自己懒得画: 这里的层次结构十分的清晰, ...

  4. 深入出不来nodejs源码-events模块

    这一节内容超级简单,纯JS,就当给自己放个假了,V8引擎和node的C++代码看得有点脑阔疼. 学过DOM的应该都知道一个API,叫addeventlistener,即事件绑定.这个东西贯穿了整个JS ...

  5. 深入出不来nodejs源码-内置模块引入再探

    我发现每次细看源码都能发现我之前写的一些东西是错误的,去改掉吧,又很不协调,不改吧,看着又脑阔疼…… 所以,这一节再探,是对之前一些说法的纠正,另外再缝缝补补一些新的内容. 错误在哪呢?在之前的初探中 ...

  6. 深入出不来nodejs源码-内置模块引入初探

    重新审视了一下上一篇的内容,配合源码发现有些地方说的不太对,或者不太严谨. 主要是关于内置模块引入的问题,当时我是这样描述的: 需要关注的只要那个RegisterBuiltinModules方法,从名 ...

  7. 深入出不来nodejs源码-timer模块(C++篇)

    终于可以填上坑了. 简单回顾一下之前JS篇内容,每一次setTimeout的调用,会在一个对象中添加一个键值对,键为延迟时间,值为一个链表,将所有该时间对应的事件串起来,图如下: 而每一个延迟键值对的 ...

  8. 深入出不来nodejs源码-流程总览

    花了差不多两周时间过了下primer C++5th,完成了<C++从入门到精通>.(手动滑稽) 这两天看了下node源码的一些入口方法,其实还是比较懵逼的,语法倒不是难点,主要是大量的宏造 ...

  9. 浅析libuv源码-编译启动

    面试的间隙回头复习了一下node,感觉node就像一个胶带,把V8和libuv粘在了一起. V8毫无疑问,负责解析执行JavaScript,相当于语言层面的桥梁:而libuv则是负责操作系统底层功能的 ...

随机推荐

  1. 2DSprite添加Light照射(Unity3D开发之十六)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/45534245 ...

  2. ”()“和”[]“引发的血案——由此引出C++中关键词new

    先来看一个程序吧: #include <iostream> #include <cassert> using namespace std; int main() { ; int ...

  3. lpad函数

    函数介绍 lpad函数是Oracle数据库函数,lpad函数从左边对字符串使用指定的字符进行填充.从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思. 2 ...

  4. 如何在Eclipse CDT中编译含有多个main函数的项目

    最近在杭电ACM上做题,使用的C++工具是Eclipse,但是Eclipse CDT不能同时存在多个main函数的文件,上网也搜了很多资料,但是按他们的步骤来,还是不能实现自己想要的效果.经过一下午的 ...

  5. javascript中通过元素id和name直接取得元素

    我们知道一些第三方的js库对如何快速选取html中的元素做了一些简化,貌似十分高深莫测,其实也不然.而且js本身自带了对于特殊元素的简便选取的方法,下面就为大家简单介绍下. 在html中,一般最直接的 ...

  6. 简单了解AJAX

    // ajax的俩个版本: var xmlhttp; if(window.xmlHttpRequest){ xmlhttp = new xmlHttpRequest(); }else{ xmlhttp ...

  7. oracle 11g杀掉锁的sql

    oracle 11g杀掉锁的sql [引用 2013-3-6 17:19:12]     字号:大 中 小 --查询出出现锁的session_idselect session_id from v$lo ...

  8. java垃圾回收总结(2)

    java垃圾回收总结(2)   上一篇文章 介绍了jvm虚拟机运行时内存结构以及如何标识需要回收的对象,这一节主要讲解垃圾回收的基本算法. 基本上 jvm内存回收有三种 基本算法 标记-清除 标记清除 ...

  9. MDF,了解一下

    1.MDF定义 MDF,全称(Measurement Data Format),即测量数据格式,是ASAM(自动化及测量系统标准协会)定义的.MDF的网页https://www.asam.net/st ...

  10. Day2_元组_字典_集合_字符编码_文件处理

    元组: 作用:存多个值,元组不可变,主要用来读 age=(11,22,33,44,55) print(age[2]) #取出元组内的值 print(age[1:4]) #取出元组内的某些值 print ...