浅析libuv源码-编译启动
面试的间隙回头复习了一下node,感觉node就像一个胶带,把V8和libuv粘在了一起。
V8毫无疑问,负责解析执行JavaScript,相当于语言层面的桥梁;而libuv则是负责操作系统底层功能的封装,例如基于IOCP的event loop、file system、non-blockiong network等。简单来说node将两者结合在一起,赋予JS操作底层方法的能力,扩大了这门语言的应用面。
其实之前一直在避开这个库,因为有点难……至于为什么突然又搞,因为之前已经把所有比较上层和简单的模块都写完了,剩下的必须深入C++部分才能理解。比如说上篇timer模块,其中的定时器执行依赖了内置模块TimerWrap对象,这个对象……呃,如下:
TimerWrap(Environment* env, Local<Object> object)
: HandleWrap(env,
object,
reinterpret_cast<uv_handle_t*>(&handle_),
AsyncWrap::PROVIDER_TIMERWRAP) {
int r = uv_timer_init(env->event_loop(), &handle_);
CHECK_EQ(r, );
}
不用懂这个,看到uv两个小字母就知道这个定时器也是由libuv实现的,并且依赖于事件轮询。
自己装的逼,含泪也要写完……迟早也需要看这个,不如开始吧。
这一节只讲怎么编译启动libuv,并在自己项目引入libuv库(windows),虽然很简单,但是搞了整整一天,异常痛苦,对于没接触过C++项目的我来说太难了。
万事第一步,先下载源码。跟node不一样,直接去github上搞:https://github.com/libuv/libuv
然后是老样子python2.6/2.7、vs2017那些,参照启动node的步骤。
最后双击目录的vcbuild,你会发现cmd窗口一闪而过,又出问题了。。。
当时我直接打开了那个bat文件,发现根本流程有点奇怪:
set target_env= @rem Look for Visual Studio only if explicitly requested.
if "%target_env%" NEQ "vs2017" goto vs-set-
echo Looking for Visual Studio
这里的target_env根本没定义,所以直接跳到寻找2015或更低版本的vs逻辑,并且上面的注释说要精确指定?于是我直接在set那里加上了=vs2017,理所当然的成功了。
但是,正确的方法是:打开当前目录的cmd,输入 vcbuild vs2017,回车
cmd会自动执行脚本,并把vs2017作为参数带进去,然后那个target_env会被赋值……我也不知道为什么只有2017要精确指定
这里的sln生成特别快,在vs中打开这个解决方案,编译运行生成一个debug文件夹。
直接讲如何在空白C++项目中引入该库,血泪教训,不要问为什么这么做,反正能跑起来!
1、生成一个windows应用台控制程序
2、把libuv目录下的include文件夹和debug/lib/libuv.lib文件都复制到自己项目的根目录下
3、打开项目/属性,然后在C/C++那点常规,在附加包含目录添加一个include,如图:

4、继续选择下面的链接器/输入,然后在附加依赖项添加一串lib:
libuv.lib
Ws2_32.lib
iphlpapi.lib
Userenv.lib
Psapi.lib
advapi32.lib
psapi.lib
shell32.lib
userenv.lib
ws2_32.lib
user32.lib
当时我只添加了一个libuv.lib,导致我流逝了了一晚上的生命,血亏。
做完这些,就可以尝试写一个demo跑一下了,测试代码如下:
#include "uv.h"
#include <iostream> int main()
{
uv_loop_t *loop = uv_default_loop();
uv_run(loop, UV_RUN_DEFAULT);
std::cout << "Hello World!\n";
}
不要问这个程序能干啥,如果编译后不报错,那就是成功了。
浅析libuv源码-编译启动的更多相关文章
- 深入出不来nodejs源码-编译启动(1)
整整弄了两天,踩了无数的坑,各种奇怪的error,最后终于编译成功了. 网上的教程基本上都过时了,或者是版本不对,都会报一些奇怪的错误,这里总结一下目前可行的流程. node版本:v10.1.0. 首 ...
- thingsboard源码编译启动
开发环境 不同的版本对应的开发环境不同(这里以3.3.3版本说明) jdk11+:参考jdk11+安装(win) Maven3.6+:Maven安装配置 Git:参考Git安装 IDEA: 参考IDE ...
- 浅析libuv源码-获取精确时间
在Timer模块中有提到,libuv控制着延迟事件的触发,那么必须想办法精确控制时间. 如果是JS,获取当前时间可以直接通过Date.now()得到一个时间戳,然后将两段时间戳相减得到时间差.一般情况 ...
- 浅析libuv源码-node事件轮询解析(3)
好像博客有观众,那每一篇都画个图吧! 本节简图如下. 上一篇其实啥也没讲,不过node本身就是这么复杂,走流程就要走全套.就像曾经看webpack源码,读了300行代码最后就为了取package.js ...
- 浅析libuv源码-node事件轮询解析(2)
上一篇讲了轮询的边角料,这篇进入正题.(竟然真有人看我博客,上两个图给你们整理下思路) 这是轮询总流程图. 下图为本节内容简图. Poll for I/O The loop blocks for I/ ...
- 浅析libuv源码-node事件轮询解析(1)
好久没写东西了,过了一段咸鱼生活,无意中想起了脉脉上面一句话: 始终保持自己的竞争力.所以,继续开写! 一般的JavaScript源码看的已经没啥意思了,我也不会写什么xx入门新手教程,最终决定还是啃 ...
- 浅析libuv源码-node事件轮询解析(4)
这篇应该能结,简图如下. 上一篇讲到了uv__work_submit方法,接着写了. void uv__work_submit(uv_loop_t* loop, struct uv__work* w, ...
- Mysql 5.7源码编译启动 报error问题:The server quit without updating PID file (/data/data_mysql/mysql.pid).
一般是报error问题就是我们的mysql没有权限,这里主要是指三点:一个是mysql的安装主目录要设为mysql用户和用户组.一个是logs目录设置为mysql用户以及用户组.还有一个是data目录 ...
- Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令
Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...
随机推荐
- 前端开发 - JavaScript
本节内容 一.如何编写 二.变量 三.数据类型 四.其他 五.语句与异常 六.函数 JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScri ...
- Android-Java多线程通讯(生产者 消费者)&等待唤醒机制
多线程通讯:例如:有一个线程任务在run生产,还有一个线程任务在run消费: VIP尊贵的身份,生产者 消费者 方式,(精心生产制作一个超级无敌好吃的面包,卖给VIP尊贵的身份消费者)生产与消费 一对 ...
- cnn公式推导
CNN公式推导 1 前言 在看此blog之前,请确保已经看懂我的前两篇blog[深度学习笔记1(卷积神经网络)]和[BP算法与公式推导].并且已经看过文献[1]的论文[Notes on Convolu ...
- C# 嵌入dll
在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形式总归让人不爽,那么有 ...
- [BeiJing wc2012]连连看(建模,最小费用最大流)
前言 突然发现自己在图论①被dalao吊着打... Solution 看到数据范围1000,感觉可以直接枚举连边,然后新建两个点就好了. 注意要拆点,不然可能会死循环(过来人) 代码实现 #inclu ...
- Java虚拟机7:垃圾收集(GC)-2(并行和并发的区别)
1.并发编程下 这两个名词都是并发编程中的概念,在并发编程的模型下的定义: 并发:是在同一个cpu上同时(不是真正的同时,而是看来是同时,因为cpu要在多个程序间切换)运行多个程序. 并行:是多个或同 ...
- [JavaScript] js实现保存文件到本地
function fake_click(obj) { var ev = document.createEvent("MouseEvents"); ev.initMouseEvent ...
- Oracle11g手动创建数据库方法
Oracle11g手动创建数据库方法 参考网页http://www.th7.cn/db/Oracle/201311/36926.shtml 安装路径 我的安装路径是:E:\app\admin\prod ...
- OC中双向链表的实现
双向链表的概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都 ...
- requests请求例子
实例一: class GetSalerInfo(View): def post(self, request): userid = request.POST/GET.get('userid',None) ...