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】Linux下MIPS平臺交叉編譯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