天天看點

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!

繼續閱讀