1. 程式人生 > >windows平臺下編譯zThread庫

windows平臺下編譯zThread庫

      今天看到《c++程式設計思想》中併發一章,作者使用zThread這個開源庫來講解,於是我也下了個版本編譯,並簡單使用了下,以下是具體步驟:

 一、建立工程

      1.下載原始碼

      2.建立工程

      開啟vs2010,建立一個windows console的空專案命名為zthread,工程目錄中就產生一個D:\My Documents\Visual Studio 2010\Projects\zthread資料夾,接下去就是把需要的檔案或目錄拷貝到該目錄下

      3.將解壓包中相關程式碼拷貝到zthread的工程目錄下,注意不要破環原先的目錄結構

      首先只需拷貝include中檔案,該目錄中有庫需要的標頭檔案,include中只有一個zthread資料夾,所以將整個資料夾拷貝到工程目錄 中,拷貝完成後在vs解決方案資源管理器中的標頭檔案目錄下新建一個刪選器命名為zthread(刪選器是一個邏輯目錄,不會在磁碟中產生相應目錄),這是為了使邏輯目錄與磁碟中目錄結構保持一致,便於程式碼管理,然後將剛才拷貝的目錄中的所有標頭檔案新增到該刪選器下。

      接下來的步驟類似,還需拷貝src目錄下的所有檔案(不包含資料夾)和win32資料夾到工程目錄下,然後新增拷貝的檔案到工程中,如果檔案在win32資料夾中,需要在vs中建立響應刪選器再新增檔案。

       4.建立一個cpp檔案,寫一個簡單main函式。然後開始編譯。

二、解決編譯問題

       編譯過程中大概會出現幾類錯誤:

       1.打不開包含的檔案

            (1).如果需要的檔案未新增工程,則按步驟3方式新增,之後根據編譯錯誤還添加了posix和vanilla兩個目錄到工程中

            (2).如果檔案已經新增到了工程中,則檢視include的相對路徑是否正確

       2.無法開啟pthread.h

              這個檔案是posix thread中的,不在zthread包中,所以需要下載,下載路徑 ftp://sourceware.org/pub/pthreads-win32/dll-latest,只需下載windows平臺下的lib、dll和三個標頭檔案,標頭檔案分別是pthread.h, sched.h, semaphore.h,下載之後在工程目錄下建立bin和lib目錄,分別存放dll和lib,把3個頭檔案直接拷貝到工程目錄下

       3.程式中對pthread_t結構體使用錯誤

               pthread_t結構體定義

                typedef struct {
                       void * p;                   /* Pointer to actual object */
                       unsigned int x;             /* Extra information - reuse count etc */
               } ptw32_handle_t;

            typedef ptw32_handle_t pthread_t;

 程式中有幾處直接對該型別物件用0初始化或者和0進行==和!=的比較,所以要稍加修改,為了不修改pthread.h 中該結構體的定義,所以自己要寫個額外的類

#pragma once
#include "pthread.h"

class ThreadId
{
public:
ThreadId(const pthread_t& tid)
: tid(tid)
{

}

bool operator==(const pthread_t& tidr)const
{
return tid.p == tidr.p && tid.x == tidr.x;
}

bool operator!=(const pthread_t& tidr)const
{
return !(operator==(tidr));
}

const static pthread_t UNINIT_THREAD_ID;
private:
const pthread_t& tid;
};

const pthread_t ThreadId::UNINIT_THREAD_ID = {NULL, 0};
//使用時將ops->_tid == 0改為ThreadId(ops->_tid) == ThreadId::UNINIT_THREAD_ID
//用ThreadId::UNINIT_THREAD_ID來初始化pthread_t型別物件

          4.連結錯誤

           (1).移除 AtomicCount類的兩個實現檔案,一個在工程目錄下,一個咋win32目錄下

            因為工程目錄下的AtomicCount.cxx程式碼如下,與平臺相關的條件編譯在下載的原始碼中已經被註釋,直接包含了#  include "vanilla/SimpleAtomicCount.cxx",所以AtomicCount的實現檔案只留vanilla目錄下的SimpleAtomicCount.cxx,其他兩個都移除,還有一個在win32目錄下,該目錄下的實現檔案不全,沒有實現++,--的前置和後置操作符

#ifndef __ZTATOMICCOUNTSELECT_H__
#define __ZTATOMICCOUNTSELECT_H__

#include "zthread/AtomicCount.h"
#include "zthread/Config.h"

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif


//// Select the correct AtomicCount implementation based on
//// what the compilation environment has defined
//
//#if defined(HAVE_ATOMIC_LINUX)
//#  include "linux/AtomicCount.cxx"
//#elif defined(ZT_WIN32)
//#  include "win32/AtomicCount.cxx"
//#elif defined(ZT_WIN9X)
//#  include "win9x/AtomicCount.cxx"
//#endif
//
//// Default to an AtomicCount that just uses a FastLock
//#ifndef __ZTATOMICCOUNTIMPL_H__
//#  include "vanilla/SimpleAtomicCount.cxx"
//#endif


#  include "vanilla/SimpleAtomicCount.cxx"

#endif // __ZTATOMICCOUNTSELECT_H__


             (2).錯誤2中下載的lib沒有在工程屬性中指定

               需要指定lib路徑,並在連結輸入相中新增lib名稱

三、簡單測試

以上問題解決後基本可以通過編譯,編譯完成後還需要將錯誤2中儲存在bin目錄下的dll拷貝到exe的目錄下,程式才能執行。

程式成功執行後可在main函式中加入測試程式碼,先寫個測試類LiftOff

#pragma once
#include <iostream>
#include "zthread/Runnable.h"

class LiftOff : public ZThread::Runnable
{
public:
	LiftOff(int nCountDown, int nId = 0)
		: m_nCountDown(nCountDown)
		, m_nId(nId)
	{

	}

	~LiftOff()
	{
		std::cout<<m_nId<<" completed\n";
	}

	virtual void run()
	{
		while(m_nCountDown--)
		{
			std::cout<<m_nId<<":"<<m_nCountDown<<std::endl;
			//Thread::yield();
		}
		std::cout<<"liftoff\n";
	}

private:
	int m_nCountDown;
	int m_nId;
};


在main函式中測試

#include "LiftOff.h"
#include "zthread/Thread.h"
using namespace ZThread;
int main()
{
	try
	{
		Thread t(new LiftOff(10));
		std::cout<<"wait\n";
	}
	catch (Synchronization_Exception& e)
	{
		std::cout<<e.what()<<std::endl;
	}

	Thread::sleep(5000);
	return 0;
}


 新增:在vs2010中編譯通過的zthread lib工程已上傳

 引申:在linux中使用zthread庫發生編譯錯誤,錯誤如下:

/home/scx/workspace/FsMonitor/Common/Thread/zthread/Guard.h:494:20: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
make: *** [Common/Thread/zthread/vanilla/SimpleAtomicCount.o] Error 1

  其中有個模板繼承的概念,錯誤原因解釋:http://blog.csdn.net/ddl007/article/details/6059580,可以通過設定-fpermissive選項來解決。

相關推薦

windows平臺編譯zThread

      今天看到《c++程式設計思想》中併發一章,作者使用zThread這個開源庫來講解,於是我也下了個版本編譯,並簡單使用了下,以下是具體步驟:  一、建立工程       1.下載原始碼       2.建立工程       開啟vs2010,建立一個window

Cocos2d-x3.9 在Windows平臺編譯打包成APK

1、搭建Android環境需要用到Android SDK、NDK、Ant和JDK。 具體的下載及安裝請參考: 2、對上文的補充 1、SDK NDK 和ANT並不需要強制安裝到同一個資料夾中,只要相

windows平臺編譯curl支援https

參看http://curl.haxx.se/download.html,curl有多個版本,會有是否包含ssl之分。如果需要使之支援https,就需要使用帶ssl的版本。 在Windows的平臺下會有多個選擇,想省事的話就直接下載win32-msvc帶ssl版的,加壓后

sqlite3在windows平臺編譯

首先,sqlite 官方已經有預編譯好的DLL下載,如果你不需要特別優化的版本,直接下載官網上的DLL即可。你可以在下載 頁面的 “Precompiled Binaries For Windows” 可以找到。 不過你想編譯出自己的版本,比如新增優化引數後編譯,de

ffmepg windows平臺編譯

在windows平臺下需要編譯一些模組進去,並開啟除錯版本. 先編譯 libx264和libfdk-aac #下載x264 wget ftp://ftp.videolan.org/pub/x264/snapshots/last_x264.tar.bz2 tar -jxvf

Windows 7 編譯boost

吐槽:樓主出來工作快2年了,自我感覺在公司還不錯,得到領導的認可,但是由於一些原因前段時間準備換工作,面試的時候被面試官問的無地自容。哎。深感自責,於是呼決定發奮圖強,不苟安於現狀,希望後面能夠再接再厲更上一層樓。 買了一本書,boost開發指南,希望能夠從中汲取到營養,

Windows平臺搭建MySQL數據

最新 mysql\ list com 計算機相關 環境 download clas ice 1、下載安裝MySQL數據庫: (1)->我的標簽->軟件下載->計算機相關專業所用軟件---百度雲鏈接下載->mysql-installer-communi

windows(msvc)編譯boost

module mode iostream oot pan pytho define 命令提示符 markdown 下載&解壓 從 http://www.boost.org/ 上下載源碼並解壓 打開 vs 的本機工具命令提示符 cd boost_sourcecode

【Linux】LinuxMIPS平臺交叉編譯FFmpeg 及使用擷取視訊中的某一幀

一.Linux下MIPS平臺交叉編譯FFmpeg庫: 1.下載ffmpeg庫的原始碼 (http://sourceforge.net/project/showfiles.php?group_id=205275&package_id=248632): [[email

【PE】Windows平臺為可執行檔案或動態dll新增版本資訊

###Date: 2017/9/22 ###Author : SoaringLee   平常我們可以看到在Windows可執行檔案中,右鍵屬性中含有檔案版本,檔名稱和版本等資訊,本文講述怎麼新增這些

windows編譯ZThread-2.3.2

到網上下載ZThread-2.3.2 用VS2008編譯靜態庫,新建win32靜態庫工程CompileZThread, 設定標頭檔案路徑../ZThread-2.3.2\include 將src資料夾

Windows平臺的動態連結(DLL)

                                     Windows平臺下的動態連結庫(DLL) 動態連結庫DLL(Dynamic Link Library)檔案又稱"應用程式拓展",是軟體檔案型別。在Windows中,許多應用程式並不是一個完整的可執行

Windows編譯OpenSSL [32位] [保證可用~~ 不服來打我呀]

土豪的OpenSSL直通車-> 點我 (我將編譯好的dll和lib上傳了,下載後可以直接使用,呼應標題~~~)非土豪的看過來:1. 開啟Visual Studio Command Prompt(2010) , 進入到OpenSSL的資料夾,執行perl Configur

Windows 平臺局域網劫持測試工具 – EvilFoca

百度 baidu small 狀態 wlan wireshark 下載鏈接 tails 學習 簡介 安全測試工具可能含有攻擊性,請謹慎適用於安全教學及學習用途,禁止非法利用! EvilFoca是Windows環境下基於.NET FrameWork的一款輕量級的劫持測試工具。

windows平臺安裝與配置mysql5.7

mysql windows 博主QQ:819594300博客地址:http://zpf666.blog.51cto.com/有什麽疑問的朋友可以聯系博主,博主會幫你們解答,謝謝支持!在windows上安裝mysql5.7需要具有系統的管理員權限。Windows平臺下提供兩種安裝方式:1、mysql二進

windows平臺利用Nginx做負載均衡

htm oot 部署 top proxy rec cnblogs access cast 1.下載nginx(http://nginx.org/en/download.html)安裝包,解壓,並使用cmd命令轉到nginx.exe所在的目錄 2.執行cmd命令start n

【翻譯自mos文章】Windows平臺的 Oraagent Memory Leak

style date any pat trac bytes issue processes ren 來源於: Oraagent Memory Leak (文檔 ID 1956840.1) APPLIES TO: Oracle Database - Ent

windows平臺vs2010編譯64位libiconv與libxml2

nmake gnu libiconv fix bat sources files 解壓 flags (一)安裝libiconv下載路徑https://ftp.gnu.org/pub/gnu/libiconv/註意這裏選擇libiconv-1.11.1版本,因為之後的版本沒有

Windows平臺將項目提交到Github上

keys tin 本地文件 ash ucc ast 生成 use pub 1.git安裝完成後,在開始菜單裏找到“Git”->“Git Bash”,一個類似命令行窗口的東西,初始設置msysgit,很簡單兩條命令即可搞定: git config --global us

Windows平臺結合 tortoiseSVN 和 VisualSVN Server 搭建SVN服務器並實現 web 站點同步

tar 效果 sql services 文檔 src 版本 att file 1. tortoiseSVN 關於 tortoiseSVN 的安裝使用詳見博文 TortoiseSVN的安裝及其簡單使用。 2. VisualSVN Server 關於 VisualS