在VS2010或VC6.0中,如何安裝Zthread多執行緒庫?

pamxy發表於2013-08-21

轉自:http://zhidao.baidu.com/link?url=Z5qaOxPo16WMLpb39wJ9O4GvKeSqM4ClRoFTnr6Gg2VREi3G54IQSzwo20axhdvchSFaIpn7T05MHYDwKihv5a

一、在Windows下使用ZThread
首先,下載ZThread,解壓到某個目錄下,我解壓到D:\libs\ZThread-2.3.2\中。
方法1:包含原始檔直接編譯(不推薦)
1.在vs2010中,新建一個新的win32 控制檯專案,選擇空專案。
2.在源目錄下新建一個main.cpp檔案,在http://zthread.sourceforge.net/html/classZThread_1_1Thread.html  中複製一段示例程式碼拷貝到main.cpp中。
3.在專案的配置屬性中,VC++目錄的包含目錄中增加ZThread的標頭檔案目錄,我這裡是:D:\libs\ZThread-2.3.2\include。配置屬性分DEBUG和RELEASE兩個,預設選擇的是DEBUG配置,但最好兩個都配置一下,否則生成RELEASE版本時會報錯
4.在專案中新建一個資料夾,名字隨意,我的叫ZThread,然後選擇這個資料夾,右鍵選擇新增->現有項,將ZThread解壓目錄中的src目錄的所有cxx檔案都加入到這個目錄中
然後現在可以編譯了,正常來說,應該編譯通過並且成功啟動程式了。
但也有可能出現一些錯誤:
錯誤一:error C2664: “GetModuleHandleW”: 不能將引數 1 從“const char [13]”轉換為“LPCWSTR”
這個是由於vs2010的專案設定預設採用了unicode字符集導致的,可以在專案屬性中將字符集改為多位元組即可,也可以在GetModuleHandle函式的字串引數加上_T()包含,改為GetModuleHandle(_T("Kernel32.dll"));

方法2:編譯成靜態庫
1.在vs2010中,新建一個新的win32 控制檯專案,我取名為ZThread.,專案型別選擇為靜態庫。
2.在專案的配置屬性中,VC++目錄的包含目錄中增加ZThread的標頭檔案目錄,我這裡是:D:\libs\ZThread-2.3.2\include。配置屬性分DEBUG和RELEASE兩個,預設選擇的是DEBUG配置,但最好兩個都配置一下,否則生成RELEASE版本時會報錯
3.在專案源目錄中,右鍵選擇新增->現有項,將ZThread解壓目錄中的src目錄的所有cxx檔案都加入到這個目錄中
然後現在可以編譯了,正常來說,應該編譯通過並且成功生成了ZThread.lib靜態庫。
但也有可能出現一些錯誤:
錯誤一:error C2664: “GetModuleHandleW”: 不能將引數 1 從“const char [13]”轉換為“LPCWSTR”
這個是由於vs2010的專案設定預設採用了unicode字符集導致的,可以在專案屬性中將字符集改為多位元組即可,也可以在GetModuleHandle函式的字串引數加上_T()包含,改為GetModuleHandle(_T("Kernel32.dll"));
靜態庫的使用方法是:
在我們的程式的工程屬性的VC++目錄的包含目錄中,增加ZThread的標頭檔案目錄。
在程式程式碼中,增加#pragma comment(lib, “ZThread.lib”)宣告,同時,需要將ZThread.lib檔案放在我們的源目錄下,跟程式碼放一起。
 
方法3,編譯成動態庫DLL
跟方法2差不多,只不過專案型別選擇為動態庫。其他步驟一樣,不再詳述,編譯成功後,會生成ZThread.lib, ZThread.dll。
使用動態庫的方法跟靜態庫一致,不同的是,使用動態庫的程式在執行時需要ZThread.dll檔案。
至此,靜態連結庫和動態連結庫我們就說完了,我們做一下對比和補充:
兩個lib檔案的不同
我們發現,無論是靜態連結庫還是動態連結庫,最後都有lib檔案,那麼兩者區別是什麼呢?其實,兩個是完全不一樣的東西。兩個ZThread.lib大小都不同,靜態庫對應的lib檔案叫靜態庫,動態庫對應的lib檔案叫匯入庫。實際上靜態庫本身就包含了實際執行程式碼、符號表等等,而對於匯入庫而言,其實際的執行程式碼位於動態庫中,匯入庫只包含了地址符號表等,確保程式找到對應函式的一些基本地址資訊。
對於靜態連結庫,我們在編譯和連結的時候已經將所有的程式碼都匯入進來,因此,當生成可執行檔案以後,可執行檔案包含所有的程式碼。因此,在可執行檔案執行時就不再需要靜態庫了,這也是為什麼我們刪掉ZThread.lib程式照樣執行;而對於動態連結庫,實際上,可執行檔案不包含DLL中的內容,只是通過匯入庫(.lib)知道了相應的地址資訊,因此,可執行檔案在執行時動態得去載入DLL,這也是為什麼我們刪掉ZThread.dll後程式就不能執行了。
對於DLL,我們是可以不要lib檔案的。如果不要lib檔案,我們可以通過函式指標的使用達到我們的目的。

相關文章