【linux】使用Ubuntu16/centos交叉编译bluez5.25

       首先非常感谢下面博主的分享,不然都无从下手怎么开始编译;我在他们的基础上准备需要依赖库进行编译,在这其中遇到一些不一样的错误,分享出来,希望能帮助到其他正在编译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:       xenial

2、开发板: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"
#endif

2、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-dev

centos:

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值