深入出不来nodejs源码-编译启动(1)
整整弄了两天,踩了无数的坑,各种奇怪的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)的更多相关文章
- 深入出不来nodejs源码-V8引擎初探
原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下 ...
- 深入出不来nodejs源码-timer模块(JS篇)
鸽了好久,最近沉迷游戏,继续写点什么吧,也不知道有没有人看. 其实这个node的源码也不知道该怎么写了,很多模块涉及的东西比较深,JS和C++两头看,中间被工作耽搁回来就一脸懵逼了,所以还是挑一些简单 ...
- 深入出不来nodejs源码-从fs.stat方法来看node架构
node的源码分析还挺多的,不过像我这样愣头完全平铺源码做解析的貌似还没有,所以开个先例,从一个API来了解node的调用链. 首先上一张整体的图,网上翻到的,自己懒得画: 这里的层次结构十分的清晰, ...
- 深入出不来nodejs源码-events模块
这一节内容超级简单,纯JS,就当给自己放个假了,V8引擎和node的C++代码看得有点脑阔疼. 学过DOM的应该都知道一个API,叫addeventlistener,即事件绑定.这个东西贯穿了整个JS ...
- 深入出不来nodejs源码-内置模块引入再探
我发现每次细看源码都能发现我之前写的一些东西是错误的,去改掉吧,又很不协调,不改吧,看着又脑阔疼…… 所以,这一节再探,是对之前一些说法的纠正,另外再缝缝补补一些新的内容. 错误在哪呢?在之前的初探中 ...
- 深入出不来nodejs源码-内置模块引入初探
重新审视了一下上一篇的内容,配合源码发现有些地方说的不太对,或者不太严谨. 主要是关于内置模块引入的问题,当时我是这样描述的: 需要关注的只要那个RegisterBuiltinModules方法,从名 ...
- 深入出不来nodejs源码-timer模块(C++篇)
终于可以填上坑了. 简单回顾一下之前JS篇内容,每一次setTimeout的调用,会在一个对象中添加一个键值对,键为延迟时间,值为一个链表,将所有该时间对应的事件串起来,图如下: 而每一个延迟键值对的 ...
- 深入出不来nodejs源码-流程总览
花了差不多两周时间过了下primer C++5th,完成了<C++从入门到精通>.(手动滑稽) 这两天看了下node源码的一些入口方法,其实还是比较懵逼的,语法倒不是难点,主要是大量的宏造 ...
- 浅析libuv源码-编译启动
面试的间隙回头复习了一下node,感觉node就像一个胶带,把V8和libuv粘在了一起. V8毫无疑问,负责解析执行JavaScript,相当于语言层面的桥梁:而libuv则是负责操作系统底层功能的 ...
随机推荐
- android 屏幕适配,hdpi,xhdpi,xxhdpi理解,常见出图
屏幕适配 首先理解下各个尺寸单位代表的意思 尺寸含义 px: 像素 dip: Density-independent pixel 独立像素密度 dpi: dot per inch 分辨率 ppi: p ...
- Swift之GCD使用指南1
Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的Dispatch Que ...
- 一键安装 redmine on rhel6.4
一键安装 redmine on rhel6.4 一键式安装redmine省去了大量不必要的时间.下载:bitnami-redmine-2.5.2-1-linux-x64-installer.run. ...
- Linux磁盘 - fdisk,partprobe, mkfs, mke2fs, fsck, badblocks, mount, mknod
磁盘分区: fdisk [root@www ~]# fdisk [-l] 装置名称 选项与参数: -l :输出后面接的装置所有的 partition 内容.若仅有 fdisk -l 时, 则系统将会把 ...
- 9.3.3 scrapy 框架
scrapy是一个非常好用的Web爬虫框架,非常适合抓取Web站点从网页中提取结构化的数据,并且支持自定义的需求.在使用scrapy爬取网页数据时,除了熟悉HTML标签,还需要了解目标网页的数据组织结 ...
- JFinal配合Shiro权限控制在FreeMarker模板引擎中控制到按钮粒度的使用
实现在FreeMarker模板中控制对应按钮的显示隐藏主要用到了Shiro中的hasRole, hasAnyRoles, hasPermission以及Authenticated等方法,我们可以实现T ...
- node_acl 路径通配
最近做一个基于nodejs的权限管理,查阅了一两天,发现大致是这样的: passportjs node-oauth rbac node_acl express_acl connect-roles 需求 ...
- 有关Java 锁原理
锁 锁是用来锁东西的,让别人打不开也看不到!在线程中,用这个“锁”隐喻来说明一个线程在“操作”一个目标(如一个变量)的时候,如果变量是被锁住的,那么其他线程就对这个目标既“操作”不了(挂起)也无法看到 ...
- 使用JConsole以及VisualVM进行jvm程序的监控,排错,调优
这里只是做一个备份,便于以后继续. 添加两个感觉好的链接吧: http://www.linuxidc.com/Linux/2015-02/113420.htm http://blog.csdn.net ...
- MLDS笔记:Generalization
1 泛化能力 用VC维来衡量一个模型的表达能力,比如2维线性模型的VC维为3. 在图1-2中,随便给啥训练数据该model都能learn起来. 从理论上来看,当2个model在训练数据上表现一样时,为 ...