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!