前言:上一篇博客主要讲了比较多原理的东西,也是我解决问题时掌握到的一些东西和重要依据,这篇博客接着上一篇博客
嵌入式linux移植——ptlib、H323plus交叉编译 I 继续往下讲~
【补充】开发环境:Ubuntu16.04 、Hi3531a ; 编译工具链:arm-hisiv300-linux ;
6.ptlib、H323plus交叉编译(编译器arm-hisiv300-linux)
(1).实现 ptlib的sample里的 hello_world 移植
来一波SHELL脚本~
kai $ tar -zxvf ptlib-2_10_9_1.tar.gz
kai $ mv ptlib-2_10_9_1 arm_ptlib
arm_ptlib $ vi configure.sh
****************************************************************
#! /bin/bash
./configure --host=arm-hisiv300-linux \
--enable-minsize \
--disable-openssl \
--disable-sdl \
*********根据需求来选择添加屏蔽相关的功能*********
********刚开始测试的时候就不要加太多依赖库********
****************************************************************
arm_ptlib $ chmod 766 configure.sh
arm_ptlib $ vi arm_ptlib/make/ptlib.mak
****************************************************************
ifndef PTLIBDIR
$(error No PTLIBDIR environment variable defined! \
You need to define PTLIBDIR! \
Try something like: ) *******************
PTLIBDIR=/home/share/armFile/arm_ptlib --根据环境更改路径
*******************
endif
****************************************************************
arm_ptlib $ ./configure.sh
arm_ptlib $ make
arm_ptlib $ cd /samples/hello_world
arm_ptlib/samples/hello_world $ vi Makefile
****************************************************************
ifndef PTLIBDIR *****************
PTLIBDIR=/home/share/armFile/arm_ptlib --根据环境更改路径
endif *****************
****************************************************************
arm_ptlib/samples/hello_world $ make && make bothnoshared
************************交叉编译完成*****************************
ps. arm_ptlib/make/ptlib.mak这个文件建议去了解一下,可以理清楚这个ptlib编译的大概思路
交叉编译ptlib这个东西主要是依赖库的细节和一些莫名其妙的坑比较多,首先ptlib这个源代码是综合了各种编译方式的,如果是一些路径没有设置好,可能编译出来的依赖库虽然是在lib_linux_arm这个文件下,不过不是arm的而且x86环境的,所以需要检查依赖库。
如果遇到编译出来的共享库是X86的,说明你的编译路径还有环境变量没有设置好~这个时候就把整个ptlib删掉,保留那个configure.sh文件即可,重新tar 一个压缩包重新来一遍,因为如果是 x86生成的一些执行文件会跟 arm 生成的一些中间执行文件(*.o,*.dep...)相互冲突,而make clean是没法clean 干净的,然后在编译执行文件的时候就会报一些 “PSDL”“PFFMPEG”“PTelnet"等等函数未引用的错误
【补充】有些可能需要export PTLIBDIR=YOURPTLIBDIR添加临时环境变量来编译,不建议写进系统的环境变量(移植性不好)
接下来,就把这个可执行文件所在的文件系统挂载到开发板上面,再把对应的共享库放在板子的 /lib 和 /usr/lib , 执行可执行文件应该就会出来你想要的结果了.
【--------------------------------------------------未完待续-2018.8.6晚-------------------------------------------】
问题抛出:用make bothnoshared出来文件大小比较大的可执行文件来测试板子上面的环境~
答案摸索:
1.猜测是嵌入式linux系统在链接动态库的时候找不到libpthread.so.0,对libpthread.so.0 研究一波,这个共享库这不就是linux的基本库线程吗,我的Ubuntu上面可以找到一大堆,于是我把我的Ubuntu的这个同名文件复制 到嵌入式开发板的 /usr/lib/ 目录下,显然能够成功找到这个库,不过提示说这个库不属于arm这个环境的,所以这个适用于x86的libpthread.so.0并不适用于arm这个环境,不过也就验证了我们的猜测。
2.这里就有两个方法了:
一个是交叉编译libpthread.so.0这个共享库,libpthread.so.0的官网:https://pkgs.org/download/libpthread.so.0
不过我还没能够编译出来,因为我的嵌入式板子的linux是海思diy出来,没有专门适用的arm版本号(uname -a查看CPU内核信息),所以这个方法对我来说不是很可行~
另外一个是把这个libthread 给./confgure的时候静态编译好,目前还在尝试中~
我的方法是修改我的configure.sh文件
#! /bin/bash
./configure --host=arm-hisiv300-linux \
--enable-minsize \
--disable-openssl \
--disable-sdl \
LDFLAGS=-lpthread \
添加了这个参数 : LDFLAGS=-lpthread \ ,也有可能需要更改makefile ,添加 -lpthread这个参数
然后一通编译,编译出sample的hello_world的执行文件正常,不过实验室停电了还没检验~
【--------------------------------------------------未完待续-2018.8.7早-------------------------------------------】
事实证明我的 ptlib 在configure执行的时候加上 LDFLAGS=-lpthread,生成的可执行文件可以说没有变化(根据文件的大小变化,因为静态编译出来的可执行文件会明显变大的多)
于是我尝试在Makefile中寻找方法,发现ptlib的makeFile有个这样的关系:
Makefile <-----arm_ptlib/make/ptlib.mak <------common.mak + unix.mak <----- (略)
然后我就在common.mak里面加上一句:
LDFLAGS += -static
结果这个可执行文件重新编译出来的大小就明显变大了(我们无法查找可执行文件的依赖库关系时,可以根据大小来判断)
对比如下:
(前)
开发板的执行结果为
(后)
开发板的执行结果为
这里就已经代表着你的程序编译通过了,但是运行的时候抛出异常。
【刨根究底】
关于这个问题:
terminate called after throwing an instance of '__gnu_cxx::__concurrence_broadcast_error'
what(): __gnu_cxx::__concurrence_broadcast_error
Aborted
参照博客:https://blog.csdn.net/skyflying2012/article/details/22855179
可以发现这个是需要静态编译pthread这个共享库,
后来找了一些嵌入式开发论坛,这种把系统依赖库静态编译进可执行文件的方法很少用于开发的场景,所以这种方法就暂且搁置掉,如有兴趣可以看上面那一篇博客。
接下来,“版本回退”到没有更改common.mak之前(也就是把common.mak那条LDFLAGS += -static去掉,虽然这也是一种编译可执行文件的方法)
问题重新定位到“./hello can't load share library 'libpthead.so.0' ”这个问题,
所以有可能是开发板裁剪的时候没有把libpthread这个动态可执行文件加进来,于是我找到开发板的官方压缩包,找到libpthread.so.0这个文件,从文件名和大小就可以察觉到它只是一个软链接而已,所以也要把lipthread-0.9.33.3.so这个共享库复制进来(这种方式也就是为了开发的移植性),然后在板子的 /usr/lib/ 建立一个软链接去使得这个可执行文件放在可以找得到这些共享库。
【问题解决】
----------------------------------2018.8.8早 交叉编译ptlib移植解决、未完待续----------------------------------------------------
(2)测试ptlib开源库的移植
(3)实现h323plus的交叉编译,并且移植到开发板上面~