<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    在Window和Linux下使用Zthread庫

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    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

    就可以了

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全