本次编译的是bluez 5版本以上的,之前的版本不支持蓝牙4.0,只有5版本以上支持4.0.我的Linux宿主机是Ubuntu14.04版本
本次编译参考http://wiki.beyondlogic.org/index.php?title=Cross_Compiling_BlueZ_Bluetooth_tools_for_ARMhttp://wiki.beyondlogic.org/index.php?title=Cross_Compiling_BlueZ_Bluetooth_tools_for_ARM
在这个基础上还做了一些小修改,避免一些错误。好开始记录步骤,比较繁琐,O(∩_∩)O。这里也对原文做一些解释。
zlib-1.2.8
zlib的编译不需要指定--host,但是后面配置完成后需要修改Makefile文件,以进行交叉编译。
源码:wget http://zlib.net/zlib-1.2.8.tar.gz
配置:./configure --prefix=/wsh_space/my_install/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
编译:
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=/wsh_space/my_install/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
安装即可。下面是具体的步骤:
源码:wget http://ftp.gnome.org/pub/gnome/sources/glib/2.40/glib-2.40.0.tar.xz
配置:./configure --host=arm-cortex_a9-linux-gnueabi --prefix=/wsh_space/my_install/bluez5 PKG_CONFIG_PATH=/wsh_space/my_install/bluez5/lib/pkgconfig 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 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 http://sourceforge.net/projects/expat/files/expat/2.1.0/expat-2.1.0.tar.gz
配置:./configure --host=arm-cortex_a9-linux-gnueabi --prefix=/wsh_space/my_install/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 http://dbus.freedesktop.org/releases/dbus/dbus-1.9.4.tar.gz
配置:./configure --host=arm-cortex_a9-linux-gnueabi --prefix=/wsh_space/my_install/bluez5 --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 http://downloads.sourceforge.net/freeassociation/libical-1.0.tar.gz
配置: export CC=arm-cortex_a9-linux-gnueabi-gcc
export CXX=arm-linux-gnueabi-g++
cmake -DCMAKE_INSTALL_PREFIX=/wsh_space/my_install/bluez5
注意这里的命令是直接在命令行执行的。
编译:
make
make install
编译readline是需要ncurses的支持,如果没有ncurses,编译时会报下面的错误。
/usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `PC' /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetflag' /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetent' /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `UP' /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tputs' /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgoto' /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `tgetnum' /usr/arm-linux-gnueabi/lib/libreadline.so: undefined reference to `BC' /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=/wsh_space/my_install/bluez5 CXX="arm-linux-gnueabi-g++"
编译:
make
make install
Readline6.3
配置时需要添加bash_cv_wcwidth_broken=yes选项,避免出现下面的错误:
checking for wcwidth broken with unicode combining characters... configure: error: in `/.../readline-6.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=/wsh_space/my_install/bluez5 bash_cv_wcwidth_broken=yes
编译:
make SHLIB_LIBS=-lncurses
make install
bluez包含了蓝牙所需的基本工具,如hciattach, hciconfig, hcitool and rfcomm等。
BlueZ 5.25 至少需要 GLib >= 2.28, D-Bus >= 1.6 and libudev >= 143,由于linudev是个相当麻烦的东西,为此在编译bluez时,把它给屏蔽了即可。
源码:wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.25.tar.xz
配置:./configure --host=arm-cortex_a9-linux-gnueabi --prefix=/wsh_space/my_install/bluez5 PKG_CONFIG_PATH=/wsh_space/my_install/bluez5/lib/pkgconfig CC="arm-cortex_a9-linux-gnueabi-gcc -L/wsh_space/my_install/bluez5/lib -I/wsh_space/my_install/bluez5/include" --disable-systemd --disable-udev --disable-cups --disable-obex --enable-library
编译:
make
make install DESTDIR=/wsh_space/my_install/bluez5
注意这里的安装会生成一个特殊的文件,如下图所示:在使用dbus-daemon时,是需要这个文件的,这个文件的结构如下图:
另外还需要把安装目录下的var文件夹拷贝到wsh_space/my_install/bluez5目录 下,如下图:
在开发板使用时,需要把wsh_space文件夹拷贝到系统的根目录下。
还需要一些库文件,我时直接把整个安装目录拷贝到开发板的/usr/local/bluetooth下。
到此,完成,其他的测试可以参考原文。