分享

libcap移植

 XeonGate 2021-06-17

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./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./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./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的整个移植算完成了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多