libmemcached-0.26にもハマる
mysql++の続きです.やはりAMD Opteronマシンにlibmemcachedの最新版をiccでコンパイルしようとしました.
まずはconfigure.
# ./configure --enable-64bit
# make
...あっさりエラーが出ました.
memcached_connect.c(9): エラー: 不完全な型は許可されていません。 struct addrinfo hints; ^ memcached_connect.c(11): エラー: 識別子 "NI_MAXSERV" は定義されていません。 char str_port[NI_MAXSERV];
構造体addrinfoはlinuxではnetdb.hで定義されており,struct addrinfo hints;って,別に妙な構文ではありません.
考えた挙句,気になったのは,コマンドの
# icc -std=c99 -DHAVE_CONFIG_H -I. -I.. -Wall -O3 -DMEMCACHED_INTERNAL -m64 -g -O2 -MT memcached_connect.lo -MD -MP -MF .deps/memcached_connect.Tpo -c memcached_connect.c -fPIC -DPIC -o .libs/memcached_connect.o
の中の,滅多に見かけないオプション,「-std=c99」. libmemcachedはCのプログラムなのですが,なんかソースを見ると,C++を意識したようなコードが各種あります.そこで,
# export CFLAGS=-std=gnu99
# ./configure --enable-64bit
# make
とすると,少し進みました.次に出たエラーは,
memcached_flush_buffers.c(8): エラー: 式を指定してください。まけ for (int x= 0; x < mem->number_of_hosts; ++x) ^ memcached_flush_buffers.c(8): エラー: 識別子 "x" は定義されていません。 for (int x= 0; x < mem->number_of_hosts; ++x)
です.これは分かりやすいです.gnu99では,関数の先頭以外の途中で勝手に変数を宣言することは許されていません.そこで,ソースの書き換えです.
元は
memcached_return memcached_flush_buffers(memcached_st *mem) { memcached_return ret= MEMCACHED_SUCCESS; for (int x= 0; x < mem->number_of_hosts; ++x)
から,
memcached_return ret= MEMCACHED_SUCCESS; int x; for (x= 0; x < mem->number_of_hosts; ++x)
と修正.makeすると,あとlibmemcached/memcached_flush_buffers.cの他に,test/の下も似たようなエラーが出ましたが,全部,純粋なC言語的に書き換えればOk.