一、前言
最近听同事说蓝牙BlueZ库很难编译成功,有几次直接把Linux系统编崩溃了(真的有这么夸张吗?反正我目前没有遇到过)。开始他们编译BlueZ5.5+的,依赖库太多,只要一个库没编译成功,之前所有的准备工作都前功尽弃了;同事无奈下转战4.95,基本都是按照网上的流程走一遍,但到了编译dbus库的时候编译不过,而且还出现了在Linux关机后无法启动了(系统崩溃了),他后来没办法,直接拿之前产品上已经移植好的bluez-3.36来暂时用用,幸运的是恰恰能用。。。。。。(虽然之前产品和目前的编译器不一样,之前时4.2.2的版本,现在的4.9.2,估计编译时所用到两个编译器的源码相同)当然,做开发,长远来说这样是解决不了问题的,而且我相信一定是可以编译通过的(Linux开源的好处就是能通过错误提示去查找源码位置),开源的代码,只要理论上可行,况且别人都已经实现了的,只是没有找到正确的方法,或者没有定位到编译出错的问题在哪里,或者开发意志不强烈,呵呵。
下面我就成功编译了bluez-4.95,截图显示了整个流程,毕竟文不如图,图不如表。以及在编译过程中遇到了什么问题,然后又是怎么解决的!当然,很多都参考了网上其他人的许多资料,但很多资料都有些小问题(不知道笔者是不是有意的哈,强迫症来了---如果要找出杀人凶手,身边的任何人都可以是嫌疑人),网上的有的资料要不是编译指令有问题,要不就是源码包的匹配有些问题,而且这些笔者也没有展示他成功编译的证据,我完全可以怀疑他是在作假??(讲下笑,认真你就输了)
开发环境
PC平台:Linux version 4.4.0-121-generic (buildd@lcy01-amd64-004) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9) ) #145-Ubuntu SMP Fri Apr 13 13:47:23 UTC 2018
交叉编译器:arm-xilinx-linux-gnueabi-gcc gcc version 4.9.2 (Sourcery CodeBench Lite 2015.05-17)
二、编译BlueZ4.95库流程
源码包一共为5个
expat-2.0.1.tar.gz
dbus-1.10.0.tar.gz
glib-2.16.2.tar.gz
bluez-4.95.tar.gz
bluez-hcidump-2.5.tar.gz
expat-2.0.1.tar.gz
dbus-1.10.0.tar.gz
glib-2.16.2.tar.gz
bluez-4.95.tar.gz
bluez-hcidump-2.5.tar.gz
1、expat-2.0.1库的编译
--prefix参数为指定目录下存放最终输出的文件(最终要移植开发板的文件) --host为交叉编译器的前缀 CC为交叉编译器的绝对路径,配置成功会生成相应的Makefile;
./configure --prefix=/usr/local/bluez-4.95 --host=arm-xilinx-linux-gnueabi CC=/mnt/workspace/qt/cross_compilers/bin/arm-xilinx-linux-gnueabi-gcc
make //下图是make后的结果
make install //下图为make install后的结果
编译expat-2.0.1库过程中shell的命令记录:
目标目录的文件如下:
2、dbus-1.10.0库的编译
在configure参数中增加依赖库expat的头文件(-I)以及库文件(-L),我同事按照网上的文章,据说就是编译dbus-1.4.1库时把他的Linux系统编崩溃了,让后他用了个最高的dbus来编译,也没通过,于是就放弃了,这是一个比较悲伤的故事。我野尝试过编译dbus-1.4.1,系统没有崩溃但确实编译出错,于是我就换成了1.10.0版本,为什么?(因为我看到别人编译bluez-3.3.6的用了它,可能能编译通过纯属我好彩)
./configure --prefix=/usr/local/bluez-4.95 --host=arm-xilinx-linux-gnueabi CC=/mnt/workspace/qt/cross_compilers/bin/arm-xilinx-linux-gnueabi-gcc --with-x=no CFLAGS=-I/usr/local/bluez-4.95/include LDFLAGS=-L/usr/local/bluez-4.95/lib
make //下图是make后的结果
make install //下图是make install后的结果
编译过程中shell的命令记录:
目标目录的文件如下:
3、编译 glib-2.16.2库
在./onfigure时提示configure: error: Could not find a glib-genmarshal in your PATH
需要执行apt-get install libglib2.0-dev命令更新库,但没有更新成功,连接失败;
apt-get install libglib2.0-dev
apt-get update
但更新库时又提示Unable to fetch some archives,maybe run apt-get update or try with --fix-missing?
sudo vim /etc/resolv.conf
nameserver 8.8.8.8 //添加在最下面。或者直接更换源来解决(替换/etc/apt/sources.list中的源)
更新成功后再安装libglib2.0-dev库,再./configure 配置
./configure --prefix=/usr/local/bluez-4.95 --host=arm-xilinx-linux-gnueabi CC=/mnt/workspace/qt/cross_compilers/bin/arm-xilinx-linux-gnueabi-gcc glib_cv_stack_grows=no glib_cv_uscore=yes glib_cv_have_qsort_r=yes ac_cv_func_posix_getpwuid_r=yes ac_cv_func_posix_getgrgid_r=yes
make //下图是make后的结果
make install //下图是make install后的结果
编译 glib-2.16.2过程shell的命令记录:
目标目录的文件如下:
4、编译bluez-4.95库
在执行./configure时提示configure: error: D-Bus library is required
export PKG_CONFIG_LIBDIR=/usr/local/bluez-4.95/lib/pkgconfig
再执行./configure配置,成功后再make
./configure --prefix=/usr/local/bluez-4.95 --host=arm-xilinx-linux-gnueabi CC=/mnt/workspace/qt/cross_compilers/bin/arm-xilinx-linux-gnueabi-gcc --enable-audio --enable-network --enable-serial --enable-input --enable-service --enable-health --enable-usb --enable-tools --enable-bccmd --enable-hid2hci --enable-hidd --enable-pand --enable-cups --enable-test CFLAGS=-I/usr/local/bluez-4.95/incl
ude LDFLAGS=-L/usr/local/bluez-4.95/lib
make //下图是make后的结果
make install //下图是make install后的结果
编译bluez-4.95过程shell的命令记录:
目标目录的文件如下:
5、编译bluez-hcidump-2.5库
首先配置再make、make install
./configure --prefix=/usr/local/bluez-4.95 --host=arm-xilinx-linux-gnueabi CC=/mnt/workspace/qt/cross_compilers/bin/arm-xilinx-linux-gnueabi-gcc
编译bluez-hcidump-2.5过程中shell的命令记录:
库已经成功编译,发现目标/usr/local/bluez-4.95下的bin和sbin目录下有很多工具,但工具都只能在嵌入式arm平台上运行,当然/usr/local/bluez-4.95目录下的include就是执行文件所依赖的头文件,lib就是执行文件所依赖的库文件
目标目录的文件如下:
后续我会演示编译5.0以上的版本,据说5.0以下的都是用的蓝牙2.0,要5.0以上才能兼容蓝牙4.0;而且我同事说5.0以上的依赖库太多了,要编译成功的机率那是微乎其微,但是我不信不能成功哈!