如何編譯64位 libuv
關於Socket基本編程模型,請參考:
- Socket編程模型之簡單選擇模型
- Socket編程模型之異步選擇模型
- Socket編程模型之事件選擇模型
- Socket編程模型之重疊IO(Overlapped I/O)模型
- Socket編程模型之完成端口模型
造輪子太費力,造出來的輪子還沒現成的開源框架做的穩定和效率高。libuv不僅把windows平臺的網絡編程模型做好了,而且也把Linux平臺的編程模型做好了,這個強大的工具還能用於MacOS平臺。編輯libuv源代碼的輸入庫提示libuv封裝了WSASetup等接口。基於libuv功能的強大、穩定和豐富可用等優異特點,學習和研究libuv是非常有必要的。
libuv的最新版本是1.21.0,下載地址:https://dist.libuv.org/dist/v1.21.0/libuv-v1.21.0.tar.gz。它的源代碼編譯起來還是有點麻煩的,它的編譯過程需要Python 2.7的運行時環境,還要一個python庫:gyp。這個東西是Google做的,源代碼、whl包都不在pypi上面,牆內的國內用戶瞪圓雙眼也無可奈何。我遇到的錯誤如下圖所示:
好在我找到了一個小竅門:
- libuv編譯文檔說明,編譯工具支持識別build文件夾下的gyp。
- node-gyp自帶了gyp源代碼。
- npmjs.com的訪問是暢通無阻的。
我從npmjs.com下載了node-gyp,然後從中提取gyp到libuv源代碼下的build文件夾下。於是有了這一幕錯誤:
錯誤原因是libuv生成的解決方案平臺是Visual Studio 2005,而且生成配置裏也沒有64位。我用Visual Studio 2017打開解決方案uv.sln,新增x64位編譯配置。最終,libuv.lib生成成功,可以拿來用了。
libuv入門
總共只有兩個代碼文件:main.cpp和Makefile。main.cpp源代碼如下:
#include #include int main(int argc,char** argv) { uv_loop_t* pnew= uv_loop_new(); std::cout<<"hello libuv."<<std::endl; uv_loop_close(pnew); return 0; }
Makefile源代碼如下:
CFLAGS=/D "_WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_CRT_SECURE_NO_WARNINGS" /D "_UNICODE" /D "UNICODE" CPPFLAGS=/D "_WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_CRT_SECURE_NO_WARNINGS" /D "_UNICODE" /D "UNICODE" /I../references/include LDFLAGS=/LIBPATH:../references/lib COMMON_LIBS=ws2_32.lib advapi32.lib user32.lib kernel32.lib userenv.lib iphlpapi.lib psapi.lib libuv.lib COMMON_OBJS= CONFIGURATION=debug A01_NAME=a01 A01_OBJS=$(CONFIGURATION)\main.obj default: A01_EXE A01_EXE: @if exist $(CONFIGURATION) rd /s /q $(CONFIGURATION) @mkdir $(CONFIGURATION) @cl /nologo /ZI /EHsc /W3 /MDd /W3 /c $(CPPFLAGS) /Fd:$(CONFIGURATION)\ /Fo:$(CONFIGURATION)\ *.cpp @link /nologo /DEBUG /MACHINE:X64 /MANIFEST:NO /OUT:$(CONFIGURATION)\$(A01_NAME).exe /PDB:$(CONFIGURATION)\$(A01_NAME).pdb /SUBSYSTEM:CONSOLE $(LDFLAGS) $(A01_OBJS) $(COMMON_LIBS) @echo generate A01 executable files finished. clean: @if exist $(CONFIGURATION) rd /s /q $(CONFIGURATION)
編譯方法:
從開始菜單打開Visual Studio 2017 x64命令行環境,如下圖所示:
打開之後cd
到代碼目錄下,運行nmake
命令即可。生成結果是debug\a01.exe
。