1. 程式人生 > >zookeeper----C/C++ client 例子在windows下編譯執行

zookeeper----C/C++ client 例子在windows下編譯執行

  1. 下載ZooKeeper,我下載的是3.4.6,解壓
  2. vs2008或者以上
  3. 在windows 環境變數中,增加ZOOKEEPER_HOME定義,指向解壓目錄
  4. 手動修改project檔案,$(ZOOKEEPER_HOME)\src\c\zookeeper.vcproj,用記事本(或者ultraedit等)開啟,由於該檔案是用utf-8編碼的,在windows下預設帶BOM頭,直接刪除前面2個位元組(即BOM頭)。
  5. 載入zookeeper.sln檔案
  6. $(ZOOKEEPER_HOME)/bin/zkServer.cmd,啟動ZooKeeper伺服器(單機standalone)
  7. 編譯並執行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
}