天天看点

LIBUV在VS2017下编译步骤(不使用Lib)

LIBUV在VS2017下编译步骤(不使用Lib)

libuv 是 Node 的新跨平台抽象层,用于抽象 Windows 的 IOCP 及 Unix 的 libev。作者打算在这个库的包含所有平台的差异性。

特性:

非阻塞 TCP 套接字

非阻塞命名管道

UDP

定时器

子进程生成

通过 uv_getaddrinfo 实现异步 DNS

异步文件系统 API:uv_fs_*

高分辨率时间:uv_hrtime

正在运行程序路径查找:uv_exepath

线程池调度:uv_queue_work

TTY控制的ANSI转义代码: uv_tty_t

文件系统事件现在支持 inotify, ReadDirectoryChangesW 和 kqueue。很快会支持事件端口:uv_fs_event_t

进程间的 IPC 与套接字共享:uv_write2

已受支持的平台: Microsoft Windows 操作系统,如 Windows XP SP2。使用 Visual Studio 或 MinGW 构建 Linux 2.6 使用 GCC 工具链 MacOS 使用 GCC 或 XCode 工具链 Solaris 121 或之后版本,使用 GCC 工具链

将LIBUV代码集成到自己的项目中,不使用Lib的形式,有一定的优点。花了不少时间,在VS2017下编译LIBUV,步骤如下:

1,在项目文件夹下建立目录libuv(可选的操作,不过便于源代码管理)。拷贝LIBUV的include目录和src目录,包括它们的众多源代码文件。其中include\uv下只保留五个文件即可:

Errno.h threadpool.h tree.h version.h win.h

src目录只保留win目录的文件,删除unix目录的文件,我的项目建立在VS2017,Win10的环境。

2,编译时,将LIBUV\include\uv, LIBUV\include, LIBUV\src\win, LIBUV\src四个文件夹加入到编译时需要的头文件目录。

选择项目属性,=>VC++目录=>包含目录

3,为提高编译速度,考虑使用预编译文件。预编译文件的详细解释,可参阅:

https://hownot2code.com/2016/08/16/stdafx-h/

为LIBUV单独加上预编译文件。

VS2017有默认的pch.h及pch.cpp做预编译文件,另外我为LIBUV增加文件LibUVPreCompile.h, LibUVPreCompile.c做预编译文件。要求LIBUV的所有.c文件第一句加上

#include "LibUVPreCompile.h"

选择LibUVPreCompile.c后,在LibUVPreCompile.c属性页=>配置属性=>c/c++=>预编译头做如下修改:

    预编译头 : 创建/Yc  (LibUVPreCompile.c创建为预编译文件LibUVPreCompile.pch)

   预编译头文件 : LibUVPreCompile.h

预编译头输出文件:LibUVPreCompile.pch

另外,将LIBUV的所有.c文件的属性都修改。修改步骤,逐一选择LIBUV的.c文件,在.c属性页=>配置属性=>c/c++=>预编译头做如下修改:

    预编译头 : 创建/Yu  (注意和前面的差别,使用预编译文件LibUVPreCompile.pch)

   预编译头文件 : LibUVPreCompile.h  (可不要吗?)

预编译头输出文件:LibUVPreCompile.pch(可不要吗?)

4,LIBUV的errno.h改名为uv_errno.h,因为和VS2017的库文件有冲突。当然,uv.h里的#include errno.h修改为:#include uv_errno.h

同样的,winsock.h->uv_winsock.h,也是命名冲突的问题。当然。winsock.c里的#include winsock.h修改为:#include uv_ winsock.h

5,在LibUVPreCompile.h里加上:

#define _CRT_SECURE_NO_DEPRECATE

#define _CRT_NONSTDC_NO_DEPRECATE

因为LIBUV里面使用了一些过时的函数。要求LIBUV的所有.c文件第一句加上#include "LibUVPreCompile.h",自然带来这个好处,不用每个文件修改此项配置。

在fs_event.c里加上,

#pragma warning( disable : 4703 ) //注意:disable(空格):

/* LIBUV这段代码有问题,long_path可能是空指针。

Tty.c里面也有同样的问题,也加上上面的编译代码。

成功通过编译,并且试验了部分代码,OK!

继续阅读