2013-05-21 72 views
0

我試圖使用libmemcached C/C++客戶端版本(0.53)ibmemcached鏈接錯誤:未定義參考`memcached_exist」

gcc -o test test.c -I/home/libmemcached/include -L/home/libmemcached/lib -lmemcached -lmemcachedutil 

寫一個示例代碼然而我得到一個錯誤

/tmp/ccoaToYP.o: In function main': test.c:(.text+0x255): undefined reference to memcached_exist'

有沒有人遇到過這個問題?由於安裝的gcc的限制,我無法使用高於0.53的版本(基本上任何1.0版本)。我看到這個命令被添加了0.53。

此外,路徑和ld_library_path也很簡單。 PATH設置爲/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/sbinLD_LIBRARY_PATH被設定爲/home/libmemcached/lib:/usr/lib:/usr/lib64:/lib

$ nm libmemcached.so | grep -i memcached_exist 00014bc2 T _Z15memcached_existP12memcached_stPKcj 00014b06 T _Z22memcached_exist_by_keyP12memcached_stPKcjS2_j $

如果我註釋掉memcached_exist通話中,其餘代碼編譯和執行就好了。

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <libmemcached/memcached.h> 

int main(int argc, char *argv[]) 
{ 
    memcached_server_st *servers = NULL; 
    memcached_st *memc; 
    memcached_return rc; 
    char *key= "keystring"; 
    char *value= "keyvalue"; 

    uint32_t flags; 
    char return_key[MEMCACHED_MAX_KEY]; 
    size_t return_key_length; 
    char *return_value; 
    size_t return_value_length; 

    memc= memcached_create(NULL); 

    servers= memcached_server_list_append(servers, "localhost", 11211, &rc); 
    rc= memcached_server_push(memc, servers); 

    if (rc == MEMCACHED_SUCCESS) 
    fprintf(stderr,"Added server successfully\n"); 
    else 
    fprintf(stderr,"Couldn't add server: %s\n",memcached_strerror(memc, rc)); 

    rc= memcached_set(memc, key, strlen(key), value, strlen(value), (time_t)0, (uint32_t)0); 

    if (rc == MEMCACHED_SUCCESS) 
    fprintf(stderr,"Key stored successfully\n"); 
    else 
    fprintf(stderr,"Couldn't store key: %s\n",memcached_strerror(memc, rc)); 

    return_value= memcached_get(memc, key, strlen(key), &return_value_length, &flags, &rc); 
    if (rc == MEMCACHED_SUCCESS) 
      { 
       fprintf(stderr,"Key %s returned %s\n",key, return_value); 
      } 
    rc = memcached_exist(memc, key, strlen(key)); 
    fprintf(stderr," Error Code: %s\n",memcached_strerror(memc, rc)); 

    return 0; 
} 

感謝 安東尼

回答

0

如果您不想編譯爲C++,則可以始終直接調用重名。如果你想讓這個代碼可以重用,並且能夠輕鬆升級庫,那麼你不應該那樣做。對於更加可擴展的解決方案,我會加入H2CO3的答案。

如果您想出於某種原因將所有主源碼編譯爲C,則可以創建一個具有調用C++庫函數的存根的.cpp文件。例如:

// libraries.cpp 
// 
// (includes needed to memcached lib call and types) 
extern "C" memcached_return memcached_exist(memcached_st *memc, char *key, size_t len) 
{ 
    return memcached_exist(memc, key, len); 
} 

然後你可以使用G ++在您的GCC線libraries.o和紐帶針對編譯libraries.cpp,並連接分佈式緩存庫。

0

名稱重整。共享目標文件包含損壞的C++函數(method?)名稱,而您的代碼編譯爲C,其中包含非重名的名稱memcached_exist。嘗試編譯你的文件爲C++。

相關問題