今天试着在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 success\n", 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 本文内容极有可能会随以上软件版本更新而变得不再适用。