libuv在Win32位編譯靜態庫無法使用的情況

最近在做一個Windows下的併發服務器項目,在VS2017下編譯以及使用libuv庫。

我這裏重點說下碰到的問題,我自身爲Win10環境,VS2017,libuv的靜態庫libuv.lib能夠編譯通過,但在使用發佈release 32位版本時(debug版未出現該問題),直接在 uv_default_loop()方法處就報了錯,最終追蹤到libuv的winapi.c下的uv_winapi_init()方法的一段代碼,如下圖:

在GetModuleHandleA("advapi32.dll"),執行這句,未獲取到advapi32.dll的數值,然後執行了uv_fatal_error(),拋出了中斷異常,且這個中斷異常是無法被try catch捕獲。查了本地操作系統的庫,是有這個動態庫的。

怎麼辦呢,最終,在編譯libuv release 32版本時,將 GetModuleHandleA方法,替換爲 LoadLibraryA("advapi32.dll"),然後再編譯並使用。最終能夠正常使用libuv的release庫。

 

對於,libuv的編譯,大體可以參考如下步驟: 

    參考自:https://blog.csdn.net/stone688598/article/details/89143624

1. install vs2017

2. git clone https://github.com/libuv/libuv

3. 下載gyp

    https://chromium.googlesource.com/external/gyp/+archive/refs/heads/master.tar.gz

4. 解壓縮gyp到 <libuv path>\build\gyp

5. cd <libuv path>

6. vcbuld.bat release x64

7. vcbuld.bat debug x64

8. 在vs2017中打開uv.sln

9. 編輯項目屬性,64位,生成dll, unicode字符等等,最重要的是linker input:

    ws2_32.lib;advapi32.lib; user32.lib;iphlpapi.lib; userenv.lib;kernel32.lib;psapi.lib

10. test.sln照此辦理, 執行test的時候可能會出錯,原因是找不到文件,修改文件絕對路徑就可以了。(沒全改,想必不是大問題)
 

測試代碼:

#include <stdio.h>
#include <iostream>
#include <uv.h>

#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "IPHLPAPI.lib")
#pragma comment(lib, "Psapi.lib")
#pragma comment(lib, "shell32.lib")
#pragma comment(lib,"user32.lib")
#pragma comment(lib, "Userenv.lib")
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"libuv.lib")
#pragma comment(lib, "msvcrtd.lib")

using namespace std;


int main(int argc, char** argv)
{
	cout << "hello world!" << endl;
	try {
		uv_loop_t *loop;
		loop = uv_default_loop();
	}
	catch (exception& e) {
		cout << e.what() << endl;
	}
	getchar();
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章