libcap 交叉编译
由于使用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 $@
以上只是本人的编译方法,如有不妥,欢迎指正并补充完善。
posted on 2016-12-14 15:30 AaronD·Chain 阅读(3523) 评论(1) 编辑 收藏 举报