acl开源库(acl-master,download: https://github.com/acl-dev/acl/)
是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。
其源码工程Linux编译及使用需要有几点需要注意:
1)acl的 Makefile文件一般使用gcc -c选项编译的,其实例也是采用该选项,实际使用中,一般是分别编译lib_acl、lib_acl_protocol、lib_acl_cpp,然后在工程中引用相应的头文件及输出库,注意这三个库的依赖关系:libprotocol.a 依赖于 libacl.a,libacl_cpp.a 依赖于 libprotocol.a 及 lib_acl.a,在使用 g++ 进行编译时必须保证库的依赖顺序,被依赖的库总是应放在后面,否则在链接程序时会报函数不存在。但是工程项目最好支持-c选项,否则会在工程链接时报一堆链接错误。
2)如果需要实际工程还包含其他库的静态/动态的链接,不能使用-c选项时,最好直接在acl-master下用命令make build_one编译出libacl_all.a和libacl_all.so,直接使用该库和其三个头文件目录即可,这样可以不采用-c选项编译也可以。
ACLDIR := $(TOPDIR)/../acl-master
INCLUDEDIR += -I"$(ACLDIR)/lib_acl/include" -I"$(ACLDIR)/lib_protocol/include" -I"$(ACLDIR)/lib_acl_cpp/include"
APPENDLIB += -L"$(ACLDIR)" -lacl_all
2)如果acl-master源码采用外挂接到虚拟系统进行编译,由于ln命令不支持,是不能make build_one完成编译的,会在进行ln时被打断,需要我们分别去acl-master/lib_acl,acl-master/lib_protocol,acl-master/lib_acl_cpp,acl-master/lib_fiber/c,acl-master/lib_fiber/cpp,和acl-master目录下去编辑其Makefile文件,将链接指向本地磁盘存储,才能完成make build_one编译。
修改示例:
static: $(OBJS_DST)
@echo 'creating $(LIB_PATH_DST)/$(STATIC_LIBNAME)'
@$(AR) $(ARFL) $(LIB_PATH_DST)/$(STATIC_LIBNAME) $(OBJS_DST)
@$(RANLIB) $(LIB_PATH_DST)/$(STATIC_LIBNAME)
@(cd $(LIB_PATH_DST); rm -f $(STATIC_OLD_LIBNAME); \
ln -s $(STATIC_LIBNAME) $(STATIC_OLD_LIBNAME))
@echo 'build $(LIB_PATH_DST)/$(STATIC_LIBNAME) ok!'
clean_lib:
rm -f $(LIB_PATH_DST)/$(STATIC_LIBNAME)
rm -f $(LIB_PATH_DST)/$(STATIC_OLD_LIBNAME)
rm -f $(LIB_PATH_DST)/libacl.so
rm -f $(OBJS_DST)
rm -f $(OBJS_DEF)
rm -f $(PCH)
修改为:
LINKDIR := /home/***/acl
static: $(OBJS_DST)
@echo 'creating $(LIB_PATH_DST)/$(STATIC_LIBNAME)'
@$(AR) $(ARFL) $(LIB_PATH_DST)/$(STATIC_LIBNAME) $(OBJS_DST)
@$(RANLIB) $(LIB_PATH_DST)/$(STATIC_LIBNAME)
@(cd $(LIB_PATH_DST); rm -f $(LINKDIR)/$(STATIC_OLD_LIBNAME); \
ln -s $(STATIC_LIBNAME) $(LINKDIR)/$(STATIC_OLD_LIBNAME))
@echo 'build $(LIB_PATH_DST)/$(STATIC_LIBNAME) ok!'
clean_lib:
rm -f $(LIB_PATH_DST)/$(STATIC_LIBNAME)
rm -f $(LINKDIR)/$(STATIC_OLD_LIBNAME)
rm -f $(LIB_PATH_DST)/libacl.so
rm -f $(OBJS_DST)
rm -f $(OBJS_DEF)
rm -f $(PCH)