0

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

ありがとうアントニー

4

2 に答える 2

0

名前マングリング。共有オブジェクト ファイルにはマングルされた C++ 関数 (メソッド?) 名が含まれていますが、コードは C としてコンパイルされ、マングルされていない名前が含まれていますmemcached_exist。ファイルを C++ としてコンパイルしてみてください。

于 2013-05-21T20:50:13.113 に答える