libcap 交叉編譯


  由於使用arm-hisiv200-linux編譯alljoyn需要libcap庫,所以這里簡單說下libcap的編譯過程。

一、GCC編譯

1.下載libcap,地址:,注意不是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,地址:

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 $@

以上只是本人的編譯方法,如有不妥,歡迎指正並補充完善。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM