在Window和Linux下使用Zthread庫

來源:互聯網
上載者:User

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

就可以了

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.