zookeeper----C/C++ client 例子在windows下編譯執行
阿新 • • 發佈:2019-01-22
- 下載ZooKeeper,我下載的是3.4.6,解壓
- vs2008或者以上
- 在windows 環境變數中,增加ZOOKEEPER_HOME定義,指向解壓目錄
- 手動修改project檔案,$(ZOOKEEPER_HOME)\src\c\zookeeper.vcproj,用記事本(或者ultraedit等)開啟,由於該檔案是用utf-8編碼的,在windows下預設帶BOM頭,直接刪除前面2個位元組(即BOM頭)。
- 載入zookeeper.sln檔案
- $(ZOOKEEPER_HOME)/bin/zkServer.cmd,啟動ZooKeeper伺服器(單機standalone)
- 編譯並執行ZooKeeper.sln中的cli工程,啟動ZooKeeper的client
第4步,如果直接開啟sln檔案,會發現不能正常載入ZooKeeper工程。因為,我們windows的預設編碼都是GBK,不能識別ZooKeeper.vcproj檔案的BOM頭。
目前,ZooKeeper自帶的c版client,非常底層,易讀性差和使用繁雜。
另外,JAVA版建議使用Curator,apache的頂級開源專案http://curator.apache.org/,Leader Select(領導選舉)
如果在X64上編譯zookeeper client,會有如下錯誤,使用了非標準擴充套件: 不支援在此結構上使用“_asm”關鍵字,需要修改程式
- fetch_and_add 這是一個原子操作級別函式,原型為int32_t fetch_and_add(volatile int32_t* operand, int incr),即 等價於:
result=operand; operand =operand + incr; return result;
裡面包含了彙編指令。
這個函式修改為如下,並在工程編譯巨集上加入WIN64,這樣可以保證win32下仍然與原始碼一致,而win64下不同:
int32_t fetch_and_add(volatile int32_t* operand, int incr) { #ifndef WIN32 int32_t result; asm __volatile__( "lock xaddl %0,%1\n" : "=r"(result), "=m"(*(int *)operand) : "0"(incr) : "memory"); return result; #else volatile int32_t result=0; //wx 修改WIN32下函式 #if !defined WIN64 _asm { mov eax, operand; //eax = v; mov ebx, incr; // ebx = i; mov ecx, 0x0; // ecx = 0; lock xadd dword ptr [eax], ecx; lock xadd dword ptr [eax], ebx; mov result, ecx; // result = ebx; } #else result = *operand; InterlockedAdd((volatile LONG*)operand,incr); #endif return result; #endif }
或者直接用InterlockedAdd函式替換,直接修改為:
int32_t fetch_and_add(volatile int32_t* operand, int incr)
{
#ifndef WIN32
int32_t result;
asm __volatile__(
"lock xaddl %0,%1\n"
: "=r"(result), "=m"(*(int *)operand)
: "0"(incr)
: "memory");
return result;
#else
volatile int32_t result= *operand;
InterlockedAdd((volatile LONG*)operand,incr);
return result;
#endif
}