Cygwin下编译libmemcached

分享Cygwinlibmemcached by 达达 at 2010-04-12

今天试着在Cygwin下编译libmemcached,遇到一些问题,经过几番折腾最终解决,并成功连接Memcached,记下来,方便别人参考。

编译libmemcached之前,需要先安装memcached,而编译安装memcached依赖于libevent。

所以,首先要下载libevent代码并编译安装,这步不会遇到什么问题,所以没什么好说明的。

接着,下载memcached代码并编译安装,配置步骤也不会有问题,只要上一步的libevent有顺利完成。

到make的时候,会遇到两个问题:
1. util.c编译无法通过。
2. 解决掉util.c的问题后,testapp.c编译通不过,提示sigaction缺少字段sa_handler。

解决第一个问题,需要打开util.c,在文件顶部加一个宏:

#define xisspace(c) isspace((unsigned char)(c))

然后,替换util.c中的isspace为xisspace。

解决第二个问题,需要打开testapp.c,找到125行的:

struct sigaction action = { .sa_handler = SIG_IGN, .sa_flags = 0};

将代码改为:

struct sigaction action;
action.sa_handler = SIG_IGN;
action.sa_flags = 0;

处理完上面两个问题,memcached应该可以正确配置并make成功了。

接着配置libmemcached,也不会有问题,在make时又会出现编译错误:client/ms_setting.h 文件59行的timeval类型找不到。

打开client/ms_setting.h,在文件头部加入time.h的包含(timeval就声明在里面):

#include "sys/time.h"

这时候应该就可以顺利编译并安装libmemcached了。

以上步骤完成后,使用以下命令启动memcached:

memcached -d -m 2048 -l 127.0.0.1 -p 11211

然后在libmemecached的代码文件夹新建一个test.c,复制以下代码到test.c。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "libmemcached/memcached.h"

int main(int argc, char *argv[])
{
    memcached_st *memc;
    memcached_return rc;
    memcached_server_st *servers;

    char value[8191];

    //connect multi server
    memc = memcached_create(NULL);
    servers = memcached_server_list_append(NULL, "localhost", 11211, &rc);
    //servers = memcached_server_list_append(servers, "localhost", 11212, &rc);
    rc = memcached_server_push(memc, servers);
    memcached_server_free(servers);

    //Save multi data
    size_t i;

    char *keys[]= {"key1", "key2", "key3"};
    size_t key_length[]= {4, 4, 4};

    char *values[] = {
        "This is c first value",
        "This is c second value",
        "This is c third value"
    };
    size_t val_length[]= {21, 22, 21};

    for (i = 0; i < 3; i++)
    {
        rc = memcached_set(
                memc,
                keys[i],
                key_length[i],
                values[i],
                val_length[i],
                (time_t)180,
                (uint32_t)0
        );

        if (rc == MEMCACHED_SUCCESS)
        {
            printf("Save key:%s data:"%s" success.n",keys[i], values[i]);
        }
    }

    char return_key[MEMCACHED_MAX_KEY];
    size_t return_key_length;

    char *return_value;
    size_t return_value_length;

    uint32_t flags;

    rc = memcached_mget(memc, keys, key_length, 3);

    while ((return_value = memcached_fetch(
        memc,
        return_key,
        &return_key_length,
        &return_value_length,
        &flags,
        &rc)))
    {
        if (rc == MEMCACHED_SUCCESS)
        {
            printf("Fetch key:%s data:"%s"n", return_key, return_value);
        }
    }

    //Delete multi data
    for (i = 0; i < 3; i++)
    {
        rc = memcached_set(
                memc,
                keys[i],
                key_length[i],
                values[i],
                val_length[i],
                (time_t)180,
                (uint32_t)0
        );

        rc = memcached_delete(
                memc,
                keys[i],
                key_length[i],
                (time_t)0
        );

        if (rc == MEMCACHED_SUCCESS)
        {
            printf("Delete %s successn", keys[i], values[i]);
        }
    }

    //free
    memcached_free(memc);

    return 0;
}

使用以下命令编译并测试:

gcc -o test test.c -L /usr/local/lib -lmemcached

如果一切正常的话,应该得到以下输入:

Save key:key1 data:"This is c first value" success.
Save key:key2 data:"This is c second value" success.
Save key:key3 data:"This is c third value" success.
Fetch key:key1 data:"This is c first value"
Fetch key:key2 data:"This is c second value"
Fetch key:key3 data:"This is c third value"
Delete key1 success
Delete key2 success
Delete key3 success

经过我测试,这时候的test.exe,是已经静态编译了libmemcached了,如果要脱离cygwin的shell执行,例如在另外一台没有安装cygwin的机器执行,除了上面编译的test.exe以外,还需要拷贝cygwin的bin目录下的cyggcc_s-1.dll和cygwin1.dll,到目标机器上的test.exe所在的目录。

声明:
1. 以上测试所用的C语言代码来自于“大宗师”的博客文章《c读写memcache
2. 本文所涉及的软件版本分别为:
cygwin-2.693、libevent-1.4.13-stable、memcached-1.4.5、libmemcached-0.39
本文内容极有可能会随以上软件版本更新而变得不再适用。