acl-masterforlinux(gcc/g++-c)

py_tty_0529發表於2018-02-08

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)