ibmemcached链接错误:对`memcached_exist’的未定义引用

我正在尝试使用libmemcached c / c ++客户端版本编写示例代码(0.53)

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

但是我得到一个错误

/tmp/ccoaToYP.o:在函数main': test.c:(.text+0x255): undefined reference to memcached_exist的main': test.c:(.text+0x255): undefined reference to

有人遇到过这个问题吗? 由于安装gcc的限制,我不能使用高于0.53的版本(基本上任何1.0)。 我看到这个命令是为0.53添加的。

此外,路径和ld_library_path也很简单。 使用/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/sbin设置PATHLD_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  #include  #include  #include  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; } 

谢谢安东尼

如果您不想编译为C ++,则可以始终直接调用损坏的名称。 如果您希望此代码可重用并且能够轻松升级库等,则不应该这样做。 对于更具扩展性的解决方案,我将添加H2CO3的答案。

如果由于某种原因希望将所有主源编译为C,则可以创建一个.cpp文件,该文件具有调用C ++库函数的存根。 例如:

 // 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); } 

然后你可以编译libraries.cpp并使用g ++链接到memcached libs到libraries.o并链接到你的gcc行上的那个。

名字错误。 共享对象文件包含受损的C ++函数(方法?)名称,而您的代码编译为C,包含非损坏的名称memcached_exist 。 尝试将您的文件编译为C ++。