zoukankan      html  css  js  c++  java
  • 浅析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, 0);
      }

      不用懂这个,看到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 2017 only if explicitly requested.
    if "%target_env%" NEQ "vs2017" goto vs-set-2015
    echo Looking for Visual Studio 2017

      这里的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!
    ";
    }

      不要问这个程序能干啥,如果编译后不报错,那就是成功了。

  • 相关阅读:
    粉丝投稿!从2月份的面试被拒到如今的阿里P7,说一说自己学java以来的经验!
    深入浅出!阿里P7架构师带你分析ArrayList集合源码,建议是先收藏再看!
    简单梳理一下Redis实现分布式Session,建议做java开发的都看看!
    HashMap知识点总结,这一篇算是总结的不错的了,建议看看!
    面试官:小伙子,够了够了,一个工厂模式你都在这说半个小时了!
    iOS-----推送机制(下)
    iOS-----推送机制(上)
    iOS-----使用CoreLocation定位
    iOS-----使用AFNetworking实现网络通信
    iOS-----JSON解析
  • 原文地址:https://www.cnblogs.com/QH-Jimmy/p/10030004.html
Copyright © 2011-2022 走看看