关于skynet的介绍可以参考下面两篇文章,Skynet设计综述和GettingStarted,其中第二篇文章内容较新。根据skynet的Makefile可以看到其支持linux/freebsd/macosx三种平台编译使用。本文记录在Linux Ubuntu下使用时遇到的一些问题。
- 在Linux下需要使用jemalloc,而编译jemalloc又需要autoconf
- 然后make linux,正常情况即可完成skynet的编译
下面是笔者在编译时遇到的问题,及解决方法。更多问题也可以参考skynet的FAQ。
错误:
checking for expr... /usr/bin/expr
checking for GNU M4 that supports accurate traces... configure: error: no acceptable m4 could be found in $PATH.
GNU M4 1.4.6 or later is required; 1.4.16 or newer is recommended.
解决方法:
apt-get insatll m4
错误:
./autogen.sh: 5: ./autogen.sh: autoconf: not found
解决方法:
wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
错误:
lua.c:81:31: fatal error: readline/readline.h: No such file or directory
解决方法:
apt-get install libreadline-dev
为了方便了解skynet编译时具体做了哪些事情,可以使用make -n将编译过程打印出来。
首先编译skynet/3rd/jemalloc,得到.so和.a
ln -sf libjemalloc.so.2 lib/libjemalloc.so
ar crus lib/libjemalloc.a src/jemalloc.o src/arena.o …然后编译skynet/3rd/lua
cd 3rd/lua && make CC=’cc -std=gnu99’ linux
ar rcu liblua.a lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o lmathlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o loadlib.o linit.o编译skynet
cc -g -O2 -Wall -I3rd/lua -o skynet skynet-src/skynet_main.c skynet-src/skynet_handle.c skynet-src/skynet_module.c skynet-src/skynet_mq.c skynet-src/skynet_server.c skynet-src/skynet_start.c skynet-src/skynet_timer.c skynet-src/skynet_error.c skynet-src/skynet_harbor.c skynet-src/skynet_env.c skynet-src/skynet_monitor.c skynet-src/skynet_socket.c skynet-src/socket_server.c skynet-src/malloc_hook.c skynet-src/skynet_daemon.c skynet-src/skynet_log.c 3rd/lua/liblua.a 3rd/jemalloc/lib/libjemalloc_pic.a -Iskynet-src -I3rd/jemalloc/include/jemalloc -Wl,-E -lpthread -lm -ldl -lrt
根据service-src下代码编译得到cservice目录下的so
cc -g -O2 -Wall -I3rd/lua -fPIC –shared service-src/service_snlua.c -o cservice/snlua.so -Iskynet-src
根据lualib-src下代码编译得到luaclib目录下的so
cc -g -O2 -Wall -I3rd/lua -fPIC –shared lualib-src/lua-skynet.c lualib-src/lua-seri.c -o luaclib/skynet.so -Iskynet-src -Iservice-src -Ilualib-src
# make -n linux
make all PLAT=linux SKYNET_LIBS="-lpthread -lm -ldl -lrt" SHARED="-fPIC --shared" EXPORT="-Wl,-E" MALLOC_STATICLIB="3rd/jemalloc/lib/libjemalloc_pic.a" SKYNET_DEFINES=""
make[1]: Entering directory `/root/skynet/src/skynet'
cd 3rd/jemalloc && make CC=cc
make[2]: Entering directory `/root/skynet/src/skynet/3rd/jemalloc'
mkdir -p src
cc -std=gnu99 -Wall -Werror=declaration-after-statement -Wsign-compare -pipe -g3 -fvisibility=hidden -O3 -funroll-loops -fPIC -DPIC -c -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -o src/jemalloc.pic.o src/jemalloc.c
cc -MM -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -MT src/jemalloc.pic.o -o src/jemalloc.pic.d src/jemalloc.c
mkdir -p src
cc -std=gnu99 -Wall -Werror=declaration-after-statement -Wsign-compare -pipe -g3 -fvisibility=hidden -O3 -funroll-loops -fPIC -DPIC -c -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -o src/arena.pic.o src/arena.c
cc -MM -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -MT src/arena.pic.o -o src/arena.pic.d src/arena.c
mkdir -p src
cc -std=gnu99 -Wall -Werror=declaration-after-statement -Wsign-compare -pipe -g3 -fvisibility=hidden -O3 -funroll-loops -fPIC -DPIC -c -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -o src/atomic.pic.o src/atomic.c
cc -MM -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -MT src/atomic.pic.o -o src/atomic.pic.d src/atomic.c
mkdir -p src
cc -std=gnu99 -Wall -Werror=declaration-after-statement -Wsign-compare -pipe -g3 -fvisibility=hidden -O3 -funroll-loops -fPIC -DPIC -c -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -o src/base.pic.o src/base.c
cc -MM -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -MT src/base.pic.o -o src/base.pic.d src/base.c
mkdir -p src
cc -std=gnu99 -Wall -Werror=declaration-after-statement -Wsign-compare -pipe -g3 -fvisibility=hidden -O3 -funroll-loops -fPIC -DPIC -c -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -o src/bitmap.pic.o src/bitmap.c
cc -MM -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -MT src/bitmap.pic.o -o src/bitmap.pic.d src/bitmap.c
mkdir -p src
cc -std=gnu99 -Wall -Werror=declaration-after-statement -Wsign-compare -pipe -g3 -fvisibility=hidden -O3 -funroll-loops -fPIC -DPIC -c -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -o src/chunk.pic.o src/chunk.c
cc -MM -D_GNU_SOURCE -D_REENTRANT -Iinclude -Iinclude -MT src/chunk.pic.o -o src/chunk.pic.d src/chunk.c
mkdir -p src
cc -std=gnu99 -Wall -Werror=declaration-aft