libcap移植
1. 写在前面
https://www.cnblogs.com/fyluyg/p/13081879.html
NDI协议是什么不在本文的研讨范围,大家有兴趣的可以到官网上或其他人的博文查看它的介绍。在这里我们只讨论怎么NDI协议移植。在写这编之前我有在网上查过资料但是基本上没找到相关资料,给官方写邮件,磕磕绊绊终于移植成功了。写下这编博文是想希望后面有相关需求的人有些借鉴资料少走弯路。闲话少叙。
NDI移植的关键点是dbus和avahi的移植。只要移植好dbus和avahi配置对就能运行NDI的例子了。
在移植前我们需要下载以下软件包 ,大家可以自己下载也可以使用我提供的软件包,
avahi-0.7.tar.xz
dbus-1.12.16.tar.xz
expat-2.2.9.tar.xz
libdaemon-0.14.tar.xz
libcap-2.25.tar.xz
2. 移植
2.1) expat移植
expat的移植很简单,就是configure,make,make install三部曲。configure可以参照我的配置:
#!/bin/bash ./configure CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --host=arm-hisiv300-linux --prefix=$(pwd)/_hisiv300_install ac_cv_func_setpgrp_void=yes --enable-shared=no --enable-static=yes\
需要加上 ac_cv_func_setpgrp_void=yes不然会报错。
2.2) libdaemon移植
libdaemon移植也是configure,make,make install就可以了。configure可以参照我的配置:
#!/bin/bash ./configure CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --host=arm-hisiv300-linux --prefix=$(pwd)/_hisiv300_install ac_cv_func_setpgrp_void=yes\
2.3) libcap移植
https://mirrors.edge.kernel.org/pub/linux/libs/security/linux-privs/libcap2/
make CROSS_COMPILE=arm-linux-gnueabihf- make DESTDIR=/home/xiaopf/tools/libcap-2.44/output-arm/ install libcap 编译简单介绍 编号9527 深圳市易思博酷客科技有限公司 高级软件工程师 由于使用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 $@ 以上只是本人的编译方法,如有不妥,欢迎指正并补充完善。 发布于 2016-11-28
2.4) dbus移植
在libdaemon移植的时候我们可以先用--prefix=$(pwd)/_hisiv300_install选项在一个目录下面编译出libdbus-1.so以便后面我们编译 avahi的时候使用,再去掉—prefix=$(pwd)/_hisiv300_install,这样我们把 dbus-daemon放到板子上的时候就没有路径问题了。
#!/bin/bash ./configure CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --host=arm-hisiv300-linux --enable-systemd=no --enable-selinux=no --enable-tests=no EXPAT_CFLAGS="-I/home/softwaves/expat-2.2.9/_hisiv300_install/include" EXPAT_LIBS="/home/softwaves/expat-2.2.9/_hisiv300_install/lib/libexpat.a" --with-session-socket-dir=/var/run/dbus --with-system-socket=/var/run/dbus/system_bus_socket --with-system-pid-file=/var/run/dbus/pid #--prefix=$(pwd)/_hisiv300_install\
2.5) avahi移植
avahi移植起来比较困难 (至少在我看来)。因为在我进行./configure的时候不论怎么设置都提示找不到expat,有知道的大佬可以分享一下。所以我手动改了configure之后的生成的avahi-daemon/Makefile文件。
#!/bin/bash ./configure CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++ --host=arm-hisiv300-linux --disable-libevent --disable-qt3 --disable-qt4 --disable-mono --with-distro=none --disable-glib --disable-gobject --disable-gtk --disable-gtk3 LIBDAEMON_CFLAGS="-I/home/softwaves/libdaemon-0.14/_hisiv300_install/include" LIBDAEMON_LIBS="/home/softwaves/libdaemon-0.14/_hisiv300_install/lib/libdaemon.a" --with-xml=none --disable-gdbm --disable-python --disable-python-dbus ac_cv_header_sys_capability_h=yes #--prefix=$(pwd)/_hisiv300_install \
avahi-daemon/Makefile修改内容如下,请修改为自己的路径
View Code
至此已经完成所有库的移植。
3. 配置
在ntfs下面运行编译生成的dbus-daemon,会提示找不到配置,把配置拷的板子相关目录,并把编译avahi生成的share/dbus-1/interfaces拷到dbus-daemon的配置目录下面。以下是我的操作,
生成的dbus配置:
生成的avahi,share/dbus-1/interfaces:
考到板子如下:
把生成的so文件拷贝到板子上并添加相应软链接,需要拷贝的so文件有:
libavahi-client.so.3.2.9
libavahi-common.so.3.5.3
libavahi-core.so.7.0.2
libdbus-1.so.3.19.11
添加dbus-daemon和avahi-daemon用户:
adduser avahi -D -H
adduser messagebus -D -H
到现在为此dbus-daemon和avahi-daemon应该能跑起来了。
4. 运行NDI例子
当然你NDI的SDK大家到NDI官网下载就可以了,下载解压是一个shell脚本,运行之后会生成头文件库文件例子等等,把NDI的examples编译出来,比如我的编译命令是
make NDILIB=arm-hisiv300-linux CC=arm-hisiv300-linux-gcc CXX=arm-hisiv300-linux-g++
需要注意的是有编译出来的可执行文件可能会报错,需要在Makefile.proj里面添加
CXXFLAGS += -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations
在运行NDI之前先运行dbus-daemon和avahi-daemon
好了我们可以运行NDI例子了比如NDIlib_Send_HEVC
至此NDI的整个移植算完成了。