【问题标题】:ibmemcached Linking Error: undefined reference to `memcached_exist'ibmemcached 链接错误:未定义对“memcached_exist”的引用
【发布时间】:2013-05-16 18:16:56
【问题描述】:

我正在尝试使用 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 tomemcached_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++ c memcached libmemcached


    【解决方案1】:

    如果你不想编译成 C++,你可以直接调用 mangled name。如果您希望此代码可重用并能够轻松升级库等,您不应该这样做。对于更可扩展的解决方案,我将添加到 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++链接到一个libraries.o并链接到你的gcc行上的memcached libs。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-01
        • 2014-01-09
        • 2022-01-01
        • 2017-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多