Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2286580
  • 博文数量: 393
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4177
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-04 13:04
文章分类

全部博文(393)

文章存档

2020年(8)

2019年(24)

2018年(135)

2017年(158)

2016年(68)

我的朋友

分类: 嵌入式

2018-01-17 17:11:56

本次编译的是bluez 5版本以上的,之前的版本不支持蓝牙4.0,只有5版本以上支持4.0.我的Linux宿主机是Ubuntu14.04版本

本次编译参考 /index.php?title=Cross_Compiling_BlueZ_Bluetooth_tools_for_ARM/index.php?title=Cross_Compiling_BlueZ_Bluetooth_tools_for_ARM

在这个基础上还做了一些小修改,避免一些错误。好开始记录步骤,比较繁琐,O(∩_∩)O。这里也对原文做一些解释。

zlib-1.2.8

zlib的编译不需要指定--host,但是后面配置完成后需要修改Makefile文件,以进行交叉编译。

源码:wget

配置:./configure --prefix=/usr/local/bluez5/bluez5

修改Makefile:

CC=arm-cortex_a9-linux-gnueabi-gcc
LDSHARED=arm-cortex_a9-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=arm-cortex_a9-linux-gnueabi-gcc -E
AR=arm-cortex_a9-linux-gnueabi-ar
RANLIB=arm-cortex_a9-linux-gnueabi-ranlib

如果不想修改Makefile那么可以修改configure配置文件:configure文件第19行后面添加一行 CHOST=arm-linux-gnueabihf。然后再用命令./configure --prefix=/usr/local/bluez5/bluez5配置即可

编译:

make

make install


libffi-3.0.13

源码:wget ftp://sourceware.org/pub/libffi/libffi-3.0.13.tar.gz

配置:./configure --host=arm-cortex_a9-linux-gnueabi --prefix=/usr/local/bluez5/bluez5

编译:

make

make install


glib-2.40.0

编译glib依赖zlib, libffi and glibc >= 2.18,宿主机若是Ubuntu14.04,glibc的版本为2.19,这里是满足的。另外很可能会缺少glib-genmarshal ,我编译时是缺少了,这个好解决,执行命令

sudo apt-get install libglib2.0-dev
安装即可。如果安装不上,那么直接下载安装包安装,地址为:,要下载三个安装包:
libglib2.0-0_2.40.2-0ubuntu1_amd64.deb、libglib2.0-bin_2.40.2-0ubuntu1_amd64.deb、libglib2.0-dev_2.40.2-0ubuntu1_amd64.deb,依次安装即可。注意这个包要取决于ubuntu的版本,比较烦人。
下面是具体的步骤:

源码:wget

配置:./configure --host=arm-cortex_a9-linux-gnueabi --prefix=/usr/local/bluez5 PKG_CONFIG_PATH=/usr/local/bluez5/lib/pkgconfig LIBFFI_CFLAGS="-I/usr/local/bluez5/lib/libffi-3.0.13/include" LIBFFI_LIBS="-L/usr/local/bluez5/lib -lffi" ZLIB_CFLAGS="-I/usr/local/bluez5/include" ZLIB_LIBS="-L/usr/local/bluez5/lib -lz" glib_cv_stack_grows=no glib_cv_uscore=yes ac_cv_func_posix_getpwuid_r=yes ac_cv_func_posix_getgrgid_r=yes

编译:

make

make install

D-Bus

D-Bus daemon会需要expat XML parser 库,所以这里需要先编译expat库。如果不安装会出现下面的错误:

checking for XML_ParserCreate_MM in -lexpat... no
configure: error: Explicitly requested expat but expat not found

步骤如下

expat-2.1.0

源码:wget

配置:./configure --host=arm-cortex_a9-linux-gnueabi --prefix=/usr/local/bluez5/bluez5

编译:

make

make install


D-Bus1.9.4

在使用原文中的配置时,编译会报错,如下:

corrupt.c:29:18: fatal error: glib.h: 没有那个文件或目录
/wsh_space/my_install/bluez5/include/glib-2.0/glib.h:30:26: fatal error: glib/galloca.h: 没有那个文件或目录
fatal error: glibconfig.h: 没有那个文件或目录

经过查看,是test目录下文件引用的.h文件路径不正确,可以一个一个修改路径,但是相当繁琐。

我的方法是,屏蔽test,增加--disable-tests选项。

源码:wget

配置:./configure --host=arm-cortex_a9-linux-gnueabi --prefix=/usr/local/bluez5/bluez5 CFLAGS=-I/usr/local/bluez5/include LDFLAGS=-L/usr/local/bluez5/lib --enable-abstract-sockets --disable-tests

编译:

make

make install


libical-1.0

bluez的编译需要libical的支持,编译libical需要cmake和g++,所以系统中需要这两个工具,可以运行下面两个命令进行安装,需要保持网络畅通。

sudo apt-get install cmake
sudo apt-get install g++-arm-linux-gnueabi

然后就可进行编译安装了

源码:wget

配置: export CC=arm-cortex_a9-linux-gnueabi-gcc
export CXX=arm-linux-gnueabi-g++

rm CMakeCache.txt#要加上避免重新配置出错
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/bluez5/bluez5

注意这里的命令是直接在命令行执行的。

编译:

make

make install


Readline


编译readline是需要ncurses的支持,如果没有ncurses,编译时会报下面的错误。

[cpp]
  1. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `PC'  
  2. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetflag'  
  3. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetent'  
  4. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `UP'  
  5. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tputs'  
  6. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgoto'  
  7. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetnum'  
  8. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `BC'  
  9. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetstr'  
引用ncurses的方法是,在make时添加SHLIB_LIBS=-lncurses选项


ncurses-5.9

源码:wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz

配置:./configure --host=arm-cortex_a9-linux-gnueabi --prefix=/usr/local/bluez5/bluez5 CXX="arm-linux-gnueabi-g++" CFLAGS=-fPIC

编译:

make

make install


Readline6.3

配置时需要添加bash_cv_wcwidth_broken=yes选项,避免出现下面的错误:

[cpp]
  1. checking for wcwidth broken with unicode combining characters...   
  2. configure: error: in `/.../readline-6.3':  
  3. configure: error: cannot run test program while cross compiling  

源码:wget ftp://ftp.cwru.edu/pub/bash/readline-6.3.tar.gz

配置:./configure --host=arm-cortex_a9-linux-gnueabi --prefix=/usr/local/bluez5/bluez5 bash_cv_wcwidth_broken=yes

编译:

make -j4 SHLIB_LIBS=-lncurses

make install


Building BlueZ


bluez包含了蓝牙所需的基本工具,如hciattach, hciconfig, hcitool and rfcomm等。

BlueZ 5.25 至少需要 GLib >= 2.28, D-Bus >= 1.6 and libudev >= 143,由于linudev是个相当麻烦的东西,为此在编译bluez时,把它给屏蔽了即可。

如果想下载,那么下载地址为:http://pkgs.fedoraproject.org/repo/pkgs/udev/

源码:wget

配置:./configure --host=arm-cortex_a9-linux-gnueabi --prefix=/usr/local/bluez5 PKG_CONFIG_PATH=/usr/local/bluez5/lib/pkgconfig CC="arm-linux-gnueabihf-gcc -L/usr/local/bluez5/lib -I/usr/local/bluez5/include -I/usr/local/bluez5/include/glib-2.0 -I/usr/local/bluez5/lib/glib-2.0/include -I/usr/local/bluez5/include/dbus-1.0 -I/usr/local/bluez5/lib/dbus-1.0/include" --disable-systemd --disable-udev --disable-cups --disable-obex --enable-library

编译:

make 

应该会报错,提示如下:

[cpp]
  1. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `PC'  
  2. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetflag'  
  3. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetent'  
  4. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `UP'  
  5. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tputs'  
  6. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgoto'  
  7. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetnum'  
  8. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `BC'  
  9. /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetstr'  
主要时链接库的问题,不知道为什么不加入,可能再编译readline时未加入。解决方法是:

在makefile的2004、2205、2211、2221、2227行添加-lncurses库的应用即可。或者编译时加入SHLIB_LIBS=-lncurses参数。

make install DESTDIR=/usr/local/bluez5

另外还可能会报 manager_init未定义的问题,这个从提示中可知,manager.c文件未编译引起的,不知道为什么配置的不会把该文件加入编译。对此问题有两 种方法,一种是修改Makefile文件加入编译,另外一种是修改Makefile.in原始配置文件,建议使用第二种,这是一劳永逸的方法。在 am__src_bluetoothd_SOURCES_DIST参数中添加manager.c编译设置,其他需要修改的地方参考src/eir.c的写法即可。


到此,完成,其他的测试可以参考原文。

注意整个变过程安装目录的选择,最好选择开发板使用的路径,免得移植的时候莫名其妙。比如在这里我使用统一的/usr/local/bluez5路径。


阅读(999) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~