我正在尝试使用 libmemcached c/c++ 客户端版本 (0.53) 编写示例代码
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/sbin
。
LD_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;
}
谢谢 安东尼
最佳答案
如果你不想编译为 C++,你可以直接调用重整后的名称。如果您希望此代码可重用并且能够轻松升级库等,那么您不应该这样做。对于更具可扩展性的解决方案,我将添加到 H2CO3 的答案中。
如果出于某种原因您希望将所有主要源代码编译为 C,您可以创建一个 .cpp 文件,其中包含调用 C++ 库函数的 stub 。例如:
// 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库链接到libraries.o并链接到您的gcc行上。
关于c++ - ibmemcached 链接错误 : undefined reference to `memcached_exist' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16679178/