Ошибка компоновки 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»

Кто-нибудь сталкивался с этой проблемой? Я не могу использовать версию выше 0.53 (в основном любую 1.0) из-за ограничений с установленным gcc. Я вижу, что эта команда была добавлена ​​для 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;
}

Спасибо
Antony

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

Затем вы можете скомпилировать library.cpp и связать библиотеку memcached с помощью g ++ с library.o и связать ее с вашей строкой gcc.

0

Другие решения

Имя калечит. Общий объектный файл содержит искаженные имена функций (методов?) C ++, а ваш код скомпилирован как C, содержащий не искаженное имя memcached_exist, Попробуйте скомпилировать ваш файл как C ++.

0

По вопросам рекламы [email protected]