首先非常感谢下面博主的分享,不然都无从下手怎么开始编译;我在他们的基础上准备需要依赖库进行编译,在这其中遇到一些不一样的错误,分享出来,希望能帮助到其他正在编译bluez或者将要编译bluez的小伙伴。
参考博客:
https://wiki.beyondlogic.org/index.php?title=Cross_Compiling_BlueZ_Bluetooth_tools_for_ARM
https://blog.csdn.net/wang_shuai_ww/article/details/41774477
开发环境:
1、Ubuntu:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04
Codename: xenial2、开发板:arm架构
3、交叉编译toochain:gcc-arm-linux-gnueabi
apt-get install gcc-arm-linux-gnueabi
sudo apt-get install g++-arm-linux-gnueabi这是我在网上直接下载的toolchain,顺利编译通过;实际工作中运用的是平台自己的toolchain,实际安装也不难,配置一下环境变量就可以了,如:vim /etc/profile 最后加上PATH="$PATH:/XXX/XXX/bin" 或者export PATH=/XXX/XXX/bin:$PATH。centos里面也是一样的操作,Ubuntu下的安装比较简单根据上面的参考博客一步步就能完成了;centos的安装会复杂一些,下面主要是centos遇到的一些编译错误。
准备好环境之后就可以根据https://wiki.beyondlogic.org/index.php?title=Cross_Compiling_BlueZ_Bluetooth_tools_for_ARM 一步一步进行安装,我是选择的安装目录是--host=arm--linux --prefix=/usr/local/bluez,注意的是toolchain一定要配置好环境变量,确认下是否安装成功了,不然编到liffi,glib的时候就想哭了。我安装的是环境是如下,这就是我交叉编译器的版本
[xxxx@localhost xxxx]$ arm-linux-gcc -v
Using built-in specs.
COLLECT_GCC=/usr/arm/xxxxx/bin/arm-linux-gnueabi-xgcc
COLLECT_LTO_WRAPPER=/usr/arm/xxxxx/bin/../libexec/gcc/arm-linux-uclibcgnueabi/4.9.3/lto-wrapper
Target: arm-linux-uclibcgnueabi
Configured with: xxxxxx release 4.9
Thread model: posix
gcc version 4.9.3 20150413 (prerelease) (......)
交叉编译
1、zlib-1.2.8 、libffi-3.0.13的安装,很顺利在/usr/local/bluez能找到对应的库文件。
2、glib-2.40.0的安装,这个问题就超多了,因为toolchain不支持gettext,就算我的主机已经安装成功了还是提示:
*** 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其实我已经安装成功了:
[root@localhost xxxxx]$ gettext -V
gettext (GNU gettext-runtime) 0.18.2
Copyright (C) 1995-1997, 2000-2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Ulrich Drepper.
进去glib-2.40.0目录看configure文件,找到上面的提示,修改
if test "$gt_cv_have_gettext" != "yes" ; then
AC_MSG_RESULT $? "
*** 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
" "$LINENO" 5
fi
再执行./congfig xxxx 就不会报这个错了,这是因为glib是依赖gettext包的,检测不到就会抛出异常并且中断,这么修改就是不中断继续处理。后面编译的时候会提示跟gettext相关的错误,我们自己修改一下就好了,一共就3个文件需要修改,但是有两个修改方式一样
1、
#include <libintl.h> 替换成:
#ifdef ENABLE_NLS
#include <libintl.h>
#else
#include "glibintl.h"
#endif2、gunixconnection.c添加未定义的函数:
static const char *ngettext (const char *msgid1, const char *msgid2, unsigned long int n)
{
const char *ret="NGETTEXT error";
return ret;
}改完之后就能成功编译了,后面一直编到libical-1.0都很顺利,跟参考博客一样,直到ncurses-5.9
如果没有装libglib2.0-dev,需要自己装一下
Ubuntu:
sudo apt-get install libglib2.0-devcentos:
libg包含在gnomeui开发包中,用这个命令就能安装,单独安装太麻烦了。
sudo yum install libgnomeui-devel
3、ncurses-5.9编译,你可能会遇到下面错误
In file included from ../ncurses/curses.priv.h:283:0,
from ../ncurses/lib_gen.c:19:
_102079.c:835:15: error: expected ‘)’ before ‘int’
../include/curses.h:1594:56: note: in definition of macro ‘mouse_trafo’
#define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen)
^
Makefile:785: recipe for target '../objects/lib_gen.o' failed
make[1]: *** [../objects/lib_gen.o] Error 1
make[1]: Leaving directory '/home/zjf/ncurses-5.9/ncurses'
Makefile:109: recipe for target 'all' failed
make: *** [all] Error 2解决办法:
./configure --host=arm-linux --prefix=/usr/local/bluezCXX="arm-linux-g++" CFLAGS=-fPIC CPPFLAGS="-P"
4、Readline6.3编译,用gcc-arm-linux-gnueabi时候,会遇到-lncurses找不到类似的情况,解法:
cp -af /usr/local/bluez/lib/libncurses.a /usr/lib/
用公司的工具链,则报toolchain找不到-lncurses,解法:
cp -af /usr/local/bluez/lib/libncurses.a /usr/arm/XXXX/usr/lib/
//把生成的libncurses.a 拷贝到工具链对应的lib目录
后面编译bluez2.25就非常顺利了,但是要生成静态的库文件还要加上--enable-library --enable-static=yes --enable-shared=yes