现在开始移植bluez的库文件和工具集。使用的版本是 bluez-lib-3.36和bluez-utils-3.36。arm-linux-gcc的版本为3.3.2 内核版本为kernel-2.6.13 编译内核和根文件系统要使用相同版本的交叉编译工具,否则编译出来的命令不能执行,出现段错误。
configure时的一点建议,configure脚本指定make install的安装目录,--prefix= 可以配置,个人感觉还是不使用这个选项。这样一般会安装到/usr下,(具体看源代码的INSTALL文件),所以编译完成后一定不能make isntall!否则会覆盖宿主系统的软件。这样做的好处是使你的目标系统目录结构很清晰,比如/usr/bin下存放的都是用户的可执行文件。/etc下都是各个软件的配置文件目录。软件的临时文件都存放在/tmp下,log信息/var下。因此我只make编译出可执行文件或库文件,然后手工拷贝到目标板中响应目录下。但这样做的前提是你要知道需要拷贝那些文件以及他们的位置。一个是通过INSTALL文件。另一个笨方法是编译两次,第一次指定--prefix=,编译并安装,查看都需要那些文件以及他们的位置,第二次不使用--prefix=只编译不安装,并参考第一次手动拷贝。
两次编译还有一个好处是当这个源代码包被其他的源码包所依赖时,可以使用生成的.pc文件替换宿主系统的.pc文件,为其他包的编译带来便利。具体原理和用方法请参考pkg-config的用法。http://linux.chinaunix.net/bbs/archiver/tid-1058530.html
当然也可以使用configure的其他选项来自定义你的目录结构,--bindir & --exec-prefix=PREFIX等。具体的参考--help帮助。
现在将编译中遇到的错误贴出来:
1. 编译bluez-libs-3.36
[mystic@moolenaar]$ ./configure --host=arm-linux CC=arm-linux-gcc
make编译通过。把make后生成的bluez.pc文件拷贝到/usr/lib/pkgconfig目录但要做好pc版本的bluez.pc的备份。下以便交叉编译完bluez后恢复。这个bluez.pc要使用
copy bluez.pc to usr/lib/pkgconfig
2. 编译bluez-utils-3.36,缺少D-Bus
[mystic@moolenaar]$ ./configure --host=arm-linux
checking pkg-config is at least version 0.9.0... yes
checking for BLUEZ... yes
checking for GLIB... no
checking for GMODULE... no
checking for dlopen in -ldl... yes
checking for DBUS... no
configure: error: D-Bus library is required
bluez-utils需要d-bus包的支持,下载d-bus的源代码编译安装。bluez-utils需要的其他一些源码包将在最后贴出。(包括使用的版本号)
3. 编译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
./configure通过后,执行make,出现如下错误:
make[2]: *** [config-loader-libxml.o] error 1
make[2]: Leaving directory `/3.3.2/dbus-1.0.2/bus'
make[1]: *** [all-recursive] error 1
make[1]: Leaving directory `/3.3.2/dbus-1.0.2'
make: *** [all] error 2
缺少xml库,下载编译安装后,copy libxml-2.0.pc /usr/lib/pkgconfig 就可以了。
4. 编译dbus,cannot find -lX11
[mystic@moolenaar]$ make
arm-linux/bin/ld: cannot find -lX11
collect2: ld returned 1 exit status
make[2]: *** [dbus-launch] error 1
make[2]: Leaving directory `/3.3.2/dbus-1.0.2/tools'
make[1]: *** [all-recursive] error 1
make[1]: Leaving directory `/3.3.2/dbus-1.0.2'
make: *** [all] error 2
在开发板上不需要X Server. configure直接屏蔽掉。
[mystic@moolenaar]$ ./configure --host=arm-linux --prefix=/bluez/dbus CC=arm-linux-gcc --cache-file=arm-linux.cache --without-x
bridge.c:82: error: `SIOCBRADDBR' undeclared (first use in this function)
bridge.c:82: error: (Each undeclared identifier is reported only once
bridge.c:82: error: for each function it appears in.)
bridge.c: In function `bridge_remove':
bridge.c:100: error: `SIOCBRDELBR' undeclared (first use in this function)
bridge.c: In function `bridge_add_interface':
bridge.c:126: error: `SIOCBRADDIF' undeclared (first use in this function)
make[2]: *** [bridge.lo] error 1
make[2]: Leaving directory `/3.3.2/bluez-utils-3.36/network'
make[1]: *** [all-recursive] error 1
make[1]: Leaving directory `/3.3.2/bluez-utils-3.36'
make: *** [all] error 2
在bluez-utils-3.36/network/bridge.h中添加如下宏定义:
#define SIOCBRADDBR 0x89a0
#define SIOCBRDELBR 0x89a1
#define SIOCBRADDIF 0x89a2
#define SIOCBRDELIF 0x89a3
6. 编译bluez-utils
[mystic@moolenaar]$ make
storage.c -fPIC -DPIC -o .libs/storage.o
storage.c: In function `encrypt_link':
storage.c:286: error: `ENOKEY' undeclared (first use in this function)
storage.c:286: error: (Each undeclared identifier is reported only once
storage.c:286: error: for each function it appears in.)
make[2]: *** [storage.lo] error 1
make[2]: Leaving directory `/3.3.2/bluez-utils-3.36/input'
make[1]: *** [all-recursive] error 1
make[1]: Leaving directory `/3.3.2/bluez-utils-3.36'
make: *** [all] error 2
在bluez-utils-3.36/input/storage.c加入宏定义
#define ENOKEY EACCES
还会遇到缺少audio模块的错误,我的蓝牙中没有使用audio,所以在./configure时也直接--disable-audio。
bluez-utils-3.36依赖的其他源码包:
[glib必须使用2.14以后版本。编译utils包时,g_timeout_add_seconds函数在此版本以后定义]
dbus-1.0.2
glib-2.14.4
libxml2-2.6.11
libsndfile-1.0.17
libusb-0.1.12