C++ ibmemcached链接错误:未定义对'memcached'u exist';

C++ ibmemcached链接错误:未定义对'memcached'u exist';,c++,c,memcached,libmemcached,C++,C,Memcached,Libmemcached,我正在尝试使用libmemcached c/c++客户端版本(0.53)编写一个示例代码 然而,我得到了一个错误 /tmp/ccoaToYP.o:在函数main'中: test.c:(.text+0x255):对memcached\u exist'的未定义引用 有人遇到过这个问题吗?由于安装gcc的限制,我不能使用高于0.53的版本(基本上是任何1.0)。我看到这个命令是为0.53添加的 此外,路径和ld_library_路径也很简单。 路径设置为/bin:/sbin:/usr/bin:/usr

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

然而,我得到了一个错误

/tmp/ccoaToYP.o:在函数
main'中:
test.c:(.text+0x255):对
memcached\u exist'的未定义引用

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

此外,路径和ld_library_路径也很简单。 路径设置为
/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/sbin
LD_LIBRARY_PATH
设置为
/home/libmemcached/lib:/usr/lib:/usr/lib64:/lib

$nm libmemcached.so | grep-i memcached|u存在 00014bc2 T_Z15memcached_existP12memcached_stPKcj 00014b06 T_Z22memcached_exist_通过_keyp12emcached_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;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
memcached_server_st*servers=NULL;
memcached_st*memc;
memu返回rc;
char*key=“keystring”;
char*value=“keyvalue”;
uint32_t标志;
char return_key[MEMCACHED_MAX_key];
大小\返回\键\长度;
char*返回_值;
大小\返回值\长度;
memc=memcached_create(NULL);
servers=memcached\u server\u list\u append(服务器,“localhost”、11211和rc);
rc=memcached\u server\u push(memc,服务器);
if(rc==MEMCACHED\u SUCCESS)
fprintf(stderr,“已成功添加服务器\n”);
其他的
fprintf(stderr,“无法添加服务器:%s\n”,memcached_strerror(memc,rc));
rc=memcached_集(memc,key,strlen(key),value,strlen(value),(time_t)0,(uint32_t)0);
if(rc==MEMCACHED\u SUCCESS)
fprintf(stderr,“密钥成功存储\n”);
其他的
fprintf(stderr,“无法存储密钥:%s\n”,memcached_strerror(memc,rc));
return\u value=memcached\u get(memc,key,strlen(key),&return\u value\u length,&flags,&rc);
if(rc==MEMCACHED\u SUCCESS)
{
fprintf(标准,“键%s返回%s\n”,键,返回值);
}
rc=memcached_exist(memc,key,strlen(key));
fprintf(标准,“错误代码:%s\n”,memcached_strerror(memc,rc));
返回0;
}
谢谢
安东尼

名字被弄脏了。共享对象文件包含被破坏的C++函数(方法)名称,而代码则被编译为C,包含未被修改的名称<代码> MycAccdEd存在< /COD>。尝试编译你的文件为C++。< /p> < p>如果你不想编译为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行中链接到该libraries.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);
}