ZThread庫是一個開源的跨平台進階物件導向的線性和sycnchronization 庫,以運行POSIX 和Win32 系統中的C++程式。
ZThread庫的首頁:http://zthread.sourceforge.net
最新版本Zthread遠嗎: http://prdownloads.sourceforge.net/zthread/ZThread-2.3.2.tar.gz
ZThread文檔:http://zthread.sourceforge.net/documentation.html
一、在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檔案,我們可以通過函數指標的使用達到我們的目的。
二、在Linux下使用ZThread
在linux下,直接通過三部曲就可以完成了,非常簡單
./configure
./make
./make install
如果在make時遇到錯誤:
../include/zthread/Guard.h: In destructor 'ZThread::Guard<LockType, LockingPolicy>::~Guard()':
../include/zthread/Guard.h:494: error: there are no arguments to 'isDisabled' that depend on a template parameter, so a declaration of 'isDisabled' must be available
只需 先export CXXFLAGS=-fpermissive,然後再執行
./configure
./make
./make install
就可以了