由於使用arm-hisiv200-linux編譯alljoyn需要libcap庫,所以這里簡單說下libcap的編譯過程。
一、GCC編譯
1.下載libcap,地址:https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/,注意不是libpcap,libpcap實在libcap基礎上開發的,alljoyn使用的是libcap;
2.解壓后,在libcap根目錄下編譯,命令:make
3.生成的庫文件在根目錄中的libcap文件目錄下,包含靜態庫libcap.a和動態庫3個,具體名稱和下載的版本有關,libcap.so,libcap.so.2,libcap.so.2.25;
4.使用的時候需要拷貝libcap文件目錄下的/include頭文件目錄,然后-lcap連接動態庫,或者指定連接libcap.a靜態庫;
二、交叉編譯
注意:相比於GCC直接編譯,交叉編譯步驟較為復雜,且不能錯一步,否則不能生成庫文件。
1.下載libcap,地址:https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/;
2.使用GCC編譯生成cap_names.h和cap_names.list.h,然后拷貝到windows桌面下或者linux其它一個目錄中,注意不能再libcap個目錄下,因為make clean會將其刪除;
3.打開libcap/下面的Makefile文件,屏蔽掉下面N行:
#_makenames: _makenames.c cap_names.list.h
# $(BUILD_CC) $(BUILD_CFLAGS) $< -o $@
#cap_names.h: _makenames
# ./_makenames > cap_names.h
#$(GPERF_OUTPUT): cap_names.list.h
# perl -e 'print "struct __cap_token_s { const char *name; int index; };\n%{\nconst struct __cap_token_s *__cap_lookup_name(const char *, unsigned int);\n%}\n%%\n"; while ($$l = <>) { $$l =~ s/[\{\"]//g; $$l =~ s/\}.*// ; print $$l; }' < $< | gperf --ignore-case --language=ANSI-C --readonly --null-strings --global-table --hash-function-name=__cap_hash_name --lookup-function-name="__cap_lookup_name" -c -t -m20 $(INDENT) > $@
#cap_names.list.h: Makefile $(KERNEL_HEADERS)/linux/capability.h
# @echo "=> making $@ from $(KERNEL_HEADERS)/linux/capability.h"
# perl -e 'while ($$l=<>) { if ($$l =~ /^\#define[ \t](CAP[_A-Z]+)[ \t]+([0-9]+)\s+$$/) { $$tok=$$1; $$val=$$2; $$tok =~ tr/A-Z/a-z/; print "{\"$$tok\",$$val},\n"; } }' $(KERNEL_HEADERS)/linux/capability.h | fgrep -v 0x > $@
並且將下面一行的cap_file去掉:
FILES=cap_alloc cap_proc cap_extint cap_flag cap_text #cap_file
4.執行make clean,此時剛才GCC編譯生成的.O文件和庫文件,以及cap_names.h和cap_names.list.h都會被刪除;
5.修改根目錄下的Makefile.Rules文件,找到CC,將默認的gcc修改為你自己的交叉編譯工具鏈,這里以arm-hisiv00-linux為例:
#CC := gcc
CC := arm-hisiv200-linux-gnueabi-gcc
6.將第2步保存的兩個.h文件拷貝到libcap文件目錄下;
7.再次執行make,不出意外還會報錯,關於/progs/getcap.c的,但庫文件已經生成,所以可以無視這個錯誤;
8.progs/下面只是提供一些局域libcap庫的工具而已,可以通過修改根目錄下面的Makefile文件來跳過編譯progs目錄,將下面這句屏蔽即可:
# $(MAKE) -C progs $@
以上只是本人的編譯方法,如有不妥,歡迎指正並補充完善。