现在的位置: 首页 > 综合 > 正文

BLUEZ在Linux下的移植

2013年08月31日 ⁄ 综合 ⁄ 共 8204字 ⁄ 字号 评论关闭

下bluez的移植~

 
   bluez的移植可以用两个字概括:麻烦!原因是它不是单纯的bluez的编译,它还需要其他很多的库的支持,下面先列举一下这些库的麻烦依赖关系吧:
  bluez-libs-3.36(不需要其他库)

bluez-utils-3.36:glib-2.16.5
dbus-1.0.2:libxml2-2.7.4
libsndfile-1.0.17
libusb-0.1.12
    前面两个必须的,后两个看你的配置,bluez4也一样;

下面开始编译:

       Bluez移植到arm s3c2410上

 

 

   搞了好几天的蓝牙协议栈(bluez)的移植,现在终于有点小成就了,写下来和大家分享。以下介绍Bluez移植的基本步骤。

   一,linux内核的配置

        Linux 2.6版本之后的内核一般都有蓝牙模块的配置,所以你不用再打补丁了。由于我也是处于摸索阶段,所以我暂时用的是开发板上自带的内核。

    #tar  zxvf   linux.2.6.*

   解压缩内核,进入内核目录。在名令行输入

# make disclean/make clean/make rmproper,

选择这三个中的任意一个 对内核进行清理,关于这三个命令的区别你可以google一下,然后自己去区分。

#make menuconfig/make config /make oldconfig /make xconfig

输入如这三个命令中的任何一个,对内核进配置,这几条命令的区别,请你自己google。推荐使用make menuconfig 。进入内核配置界面之后,根据你的自己的需要进行选择。关于内核的配置请单独查看内核配置方面的文档。

#make zImage ARCH=arm CROSS_COMPILE=arm-linux-

到此内核镜像就已经做好了。


二,编译bluez协议栈。

   移植过蓝牙协议栈的人,肯定会觉得,Bluez协议栈的编译是最麻烦的一件事情。其实,如果你能理清楚bluez-utils所依赖的一些库,你就能很快的cross-compile交叉编译出一套能在开发板上跑起来的程序。关键是如何去理清楚协议,我总结出来的方法是,倒着推,你不知道bluez-utils依赖那些库,那就先直接编译bluez-utils,根据编译显示的错误,分析错误,找出来它所依赖的库,这样一步一步的分析下去,你就可以把蓝牙协议栈交叉编译出来。如果你不会分析错误或则不想去分析,可以,那你就直接把错误粘贴到网上,让搜索引擎给你找。

由于时间的仓促,这里我只列出我已经总结出来的Bluez所需要的几个库,以及几个库编译的先后顺序。


注:/opt/libs 和/opt/utils是我自己编译时用的路径,你可以随便的选取。

1,编译安装bluez-lib-3.36.tar.gz

   这个库不需要什么依赖,直接解压,配置,编译然后安装即可。

  #tar zxvf bluez-lib-3.36.tar.gz

  #./configure --profix=/opt/libs --host=arm-linux --target=arm-linux CC=arm-linux-gcc

  #make 

  #make install


2,编译安装

  这个库是后面的dbus依赖的,你也可以用expat来代替libxml2,官方网站上说dbus必须依赖于他们中的一个。

  #tar zxvf libxml2-2.7.4.tar.gz

  #./configure --profix=/opt/libs --host=arm-linux --target=arm-linux     CC=arm-linux-gcc

  #make 

  #make install


3,编译安装dbus-1.0.2.tar.gz

  #tar zxvf dbus-1.2.16.tar.gz

  #echo ac_cv_have_abstract_sockets=yes>arm-linux.cache

  #./configure --profix=/opt/libs --host=arm-linux --target=arm-linux     CC="arm-linux-gcc -I/opt/libs/include -L/opt/libs/lib" --cache-file=arm-linux.cache --with-x=no

  #make 

  #make install


4,编译安装glib-2.16.5

  #tar  -zxjf  glib-2.16.5.tar.bz2

#echo ac_cv_type_long_long=yes>arm-linux.cache

#echo glib_cv_stack_grows=no>>arm-linux.cache

#echo glib_cv_uscore=no>>arm-linux.cache

#echo c_cv_func_posix_getpwuid_r=yes>>arm-linux.cache

#echo ac_cv_func_posix_getgrgid_r=yes>>

注意:">"和">>"的区别

#./configure --profix=/opt/libs --host=arm-linux --target=arm-linux     CC="arm-linux-gcc -I/opt/libs/include -L/opt/libs/lib" --cache-file=arm-linux.cache

#make 

#make install


5,编译安装libusb-0.1.12.tar.gz

   这个库不需要什么依赖,直接解压,配置,编译然后安装即可。

  #tar zxvf  libusb-0.1.12.tar.gz

  #./configure --profix=/opt/libs --host=arm-linux --target=arm-linux CC="arm-linux-gcc -I/opt/libs/include -L/opt/libs/lib"

  #make 

  #make install


6,编译安装bluez-utils-3.36.tar.gz

  #tar zxvf bluez-utils-3.36.tar.gz

  #./configure --profix=/opt/libs --host=arm-linux --target=arm-linux     CC="arm-linux-gcc -I/opt/libs/include -L/opt/libs/lib" --disable-audio

  #make 

  #make install

这样Bluez协议栈就编译好了。


三,烧写到开发板上

     实际上放到板上的只需要

 

l2cap.o                 libbluetooth.so.2.11.2         
start.sh                libbluetooth.so                               
bnep.o                  libbluetooth.so.2                           
hci_usb.o                     
rfcomm.o

start.sh是启动模块的支持,也可以insmod进去,其他的是程序要用到的库。

可能遇到的错误及解决方法:
a、编译程序的时候
wen@wen-desktop:~$ arm-linux-gcc -I/home/wen/bluez/bluez-libs-3.36_install/include  -L/home/wen/bluez/bluez-4.69/lib/.libs client.c -o client_arm/tmp/ccGbPHFl.o(.text+0x38): In function `main':
: undefined reference to `hci_get_route'
/tmp/ccGbPHFl.o(.text+0x48): In function `main':
: undefined reference to `hci_open_dev'
/tmp/ccGbPHFl.o(.text+0xd4): In function `main':
: undefined reference to `str2ba'
collect2: ld returned 1 exit status
wen@wen-desktop:~$ arm-linux-gcc -I/home/wen/bluez/bluez-libs-3.36_install/include  -L/home/wen/bluez/bluez-4.69/lib/.libs -lbluetooth client.c -o client_arm
wen@wen-desktop:~$

-lbluetooth 就是代表-llibbluetooth.so -L <包含库的目录> -lbluetooth

就是找此目录下的libbluetooth.so或者libbluetooth.a去链接

b、libgmodule.so :invalid reconize
libgmodule.so在glib里面,再在配置文件中改为CC="arm-linux-gcc -L/glib_lib_dir"

c、storage.c:286: error: `ENOKEY' undeclared (first use in this function)
在 bluez-utils-3.36/input/storage.c 中添加宏定义:#define ENOKEY 161

d、__libc_csu_init undefined reference to `__init_array_end'
配置文件里面的编译器加-shared为:CC="arm-linux-gcc -shared 。。。"

e、cc1: error: unrecognized command line option "-fvisibility=hidden
说是编译器版本太低的缘故。在高版本里面才支持"-Wno-pointer-sign"、"-fvisibility=hidden"。
后来使用PC上的编译器(gcc版本4.4.1,而arm-linux-gcc是3.4.4)试了一下,就没出现这个错误,由此可推断确实是编译器版本问题。既然低版本没有这个指令,我就删掉libusb-compat-0.1.3/libusb/Makefile里面的"-Wno-pointer- sign"和"-fvisibility=hidden",之后OK(如果其他Makefile也有,也要删)。编完之后也要将库和头文件复制到工具链里面去。

f、configure: error: Netlink library is required

解决方法: apt-get install libnl-dev     and     libnl-doc

h、 解决安装glib的编译错误
 stack pointer 问题:
echo ac_cv_type_long_long=yes>arm-linux.cache
echo glib_cv_stack_grows=no>>arm-linux.cache
echo glib_cv_uscore=no>>arm-linux.cache
echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache

i、configure: error: Could not find a glib-genmarshal in your PATH
网上:解压glib2-devel-2.4.7-1.tar.gz, 将文件复制到/usr/local下面
实际:$ sudo apt-get install libglib2.0-dev
原来下载个这东西就行了

j、checking for growing stack pointer... configure: error: cannot run test program while cross compiling
#echo ac_cv_type_long_long=yes>arm-linux.cache

#echo glib_cv_stack_grows=no>>arm-linux.cache

#echo glib_cv_uscore=no>>arm-linux.cache

#echo c_cv_func_posix_getpwuid_r=yes>>arm-linux.cache

k、checking for posix getpwuid_r... configure: error: in `/home/yan/glib-2.22.4':

configure: error: cannot run test program while cross compiling

See `config.log' for more details.

解决方法:ppcst# echo ac_cv_func_posix_getwuid_r=yes

l、源代码安装glib-2.22.5

root@zhupan-desktop:/home/zhupan/glib-2.22.5# ./configure

configure: error:

*** You must have either have gettext support in your C library, or use the

*** GNU gettext library. (http://www.gnu.org/software/gettext/gettext.html

解决:

i. 尝试 apt-get install gettex,错误,提示:E: 无法找到软件gettext
ii. 下载gettext-0.16.1安装

m、
configure: error: Netlink library is required
configure: error: dbus library is required

1、wen@wen-desktop:~/bluez/bluez-4.69$ export DBUS_CFLAGS=/home/wen/bluez/libxml/include    /libxml2/libxml
wen@wen-desktop:~/bluez/bluez-4.69$ export DBUS_LIBS=/home/wen/bluez/libxml/lib
2、把编译出来的两个lib的pkconfig里面的.pc放到/usr/lib/pkgconfig/里面,或者设置在PKG_CONFIG_PATH里面

n、. 编译D-Bus,can not run test program while cross compiling

[mystic@moolenaar]$ ./configure --host=arm-linux --prefix=/bluez/dbus  CC=arm-linux-gcc

checking for getpeereid... no

checking abstract socket namespace... configure: error: cannot run test program while cross compiling

See `config.log' for more details.

执行./configure时要在宿主系统中运行一些测试程序,因为是交叉编译所以这个测试是一定通不过的。不过没问题,我们可以在configure时指定cache-file文件来屏障掉测试程序,在下面编译glib包时会遇到同样的问题。

处理方法:
在源码包根目录下执行
[mystic@moolenaar]$ echo ac_cv_have_abstract_sockets=yes > arm-linux.cache
[mystic@moolenaar]$ ./configure --host=arm-linux --prefix=/bluez/dbus  CC=arm-linux-gcc --cache-file=arm-linux.cache

o./configure出现
checking for C compiler default output file name... configure: error: C compile cannot execulable
查看:config.log文件,发现是环境变量(LIBS  LDFLAGS)设置错误,和lib

p、configure: error: libxml library is required

缺少xml库,下载编译安装后,copy  libxml-2.0.pc /usr/lib/pkgconfig 就可以了。

q、/bin/rm: cannot remove `libtoolT': No such file or directory
Done configuring
libxml的配置出现以上问题;
解决:可以直接编译make,不影响

r、/tmp/ccs2uTxL.o(.text+0x38): In function `main':
: undefined reference to `hci_get_route'
/tmp/ccs2uTxL.o(.text+0x48): In function `main':
: undefined reference to `hci_open_dev'
/tmp/ccs2uTxL.o(.text+0xd4): In function `main':
: undefined reference to `str2ba'
collect2: ld returned 1 exit status
解决方法:
-lbluetooth

s、
client.c:3:22: bluetooth.h: No such file or directory
client.c:4:16: hci.h: No such file or directory
client.c:5:20: hci_lib.h: No such file or directory
client.c:6:19: rfcomm.h: No such file or directory

解决方法:
-I/头文件目录

t、[转]error: cannot run test program while cross compili
在交叉编译的时候总是使用configure --host=arm-linux 嘿嘿但是在CONFIGURE中有很多的
测试程序是不可以在HOST上运行的就会出现: error: cannot run test program while cross compiling
注意到abstract socket namespace在configure中查找abstract socket可以看到类似这样>的结构
echo "$as_me:$LINENO: checking abstract socket namespace" >&5
echo $ECHO_N "checking abstract socket namespace... $ECHO_C" >&6
if test "${ac_cv_have_abstract_sockets+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
其中ac_cv_have_abstract_sockets是我们要查找的变量
使用echo ac_cv_have_abstract_sockets=yes>arm-linux.cache
然后
./configure --host=arm-linux --cache-file=arm-linux.cache
OK这样就搞定了

u、问题:arm_linux -randlgcc cannoe found
解决办法:到root权限下make  并检查arm-linux-gcc 有没有加到PATH中

v、configure: error: GLib library version 2.14 or later is required
1 设置环境变量GLIB与LIBS, ./configure --help里面查看;
2 把编出来的库lib/pkconfig/*.pc放到/usr/lib/pkgconfig

抱歉!评论已关闭.