交叉编译Bluez-5.0(uclibc)

BlueZ是Linux官方蓝牙协议栈。本文记录在Ubuntu18.04上基于uclibc交叉编译bluez-5.0版本。
由于uclibc中部分glibc中的接口并没有实现,所以基于uclibc编译时需要寻找替代版本。

本文参考了:https://blog.csdn.net/phoenixtree7/article/details/40857985

本文编译、验证环境

使用Ubuntu18.04 x86_64进行交叉编译
目标机为君正T31
工具链为:mips-linux-gnu-gcc,uclibc
按照本文步骤编译出错大概率是电脑需要安装环境,由于本文是事后整理,难免会有遗漏

在其他电脑按照本教程编译出现了一些其他的错误现补充到文章最后。也欢迎把你在编译过程中遇到的错误发送给我,我将补充到文章最后。

源码下载地址

依赖库

1)D-Bus library
下载地址:http://www.freedesktop.org/wiki/Software/dbus#Download
2) GLib library G
下载地址:http://ftp.gnome.org/pub/gnome/sources/glib
3) USB library
下载地址:http://www.libusb.org/
4) alsa-libALSA
下载地址:http://www.alsa-project.org/

编译过程

1)编译 alsa-lib 库

tar xvf alsa-lib-1.2.3.2.tar.bz2					#解压
cd alsa-lib-1.2.3.2										#打开源码目录
vim run.sh														#编辑配置
#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue

./configure \
    --prefix=$blue \
    CC="mips-linux-gnu-gcc -march=mips32r2 -muclibc" \
    --host=mips-linux-gnu \
    --disable-python

chmod +x run.sh											# 给可执行权限
./run.sh															# 配置

执行完上面的代码后已经配置完成,下面开始编译

make																# 编译
make install													# 安装到目标目录

2)编译 expat

tar zxvf expat-2.3.0.tar.gz
cd expat-2.3.0/
vim run_config.sh
#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue

./configure \
  --prefix=$blue \
  CC="mips-linux-gnu-gcc -march=mips32r2 -muclibc" \
  --host=mips-linux-gnu 
chmod +x run_config.sh
./run_config.sh
make
make install

3)D-Bus

tar zxvf dbus-1.12.20.tar.gz
cd dbus-1.12.20/
vim run.sh
#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue
echo ac_cv_have_abstract_sockets=yes>arm-linux.cache

./configure \
    --prefix=$blue \
    CC="mips-linux-gnu-gcc -march=mips32r2 -muclibc  -I$blue/include -L$blue/lib" \
    --host=mips-linux-gnu \
    --with-x=no \
    --disable-tests
    # --host=arm-linux--cache-file=arm-linux.cache \
 chmod +x  run.sh
 ./run.sh
 make 
 make install

4)编译gettext
为了解决在编译glib时出现glibintl.h:16:21: fatal error: libintl.h: No such file or directory的问题

tar xvf gettext-0.20.2.tar.gz
cd gettext-0.20.2/
vim run.sh
#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue

./configure \
    --prefix=$blue \
    CC="mips-linux-gnu-gcc" \
    CXX="mips-linux-gnu-g++" \
    CFLAGS=" -march=mips32r2 -muclibc  -I$blue/include -L$blue/lib -DMIPS=1 -fPIC" \
    CXXFLAGS=" -march=mips32r2 -muclibc  -I$blue/include -L$blue/lib -DMIPS=1 -fPIC" \
    --host=mips-linux-gnu 
 chmod +x  run.sh
 ./run.sh
make
make install

5)编译libffi
解决编译glib时出现gclosure.c:27:17: fatal error: ffi.h: No such file or directory的问题

tar xvf libffi-3.3.tar.gz
cd libffi-3.3/
vim run.sh
#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue

./configure \
    --prefix=$blue \
    CC="mips-linux-gnu-gcc" \
    CXX="mips-linux-gnu-g++" \
    CFLAGS="-march=mips32r2 -muclibc  -I$blue/include -L$blue/lib" \
    CXXFLAGS="-march=mips32r2 -muclibc  -I$blue/include -L$blue/lib" \
    --host=mips-linux-gnu 
 chmod +x  run.sh
 ./run.sh
 make
 make install

6)编译zlib
解决在glib编译时出现gzlibcompressor.c:26:18: fatal error: zlib.h: No such file or directory的问题

git clone https://codechina.csdn.net/mirrors/madler/zlib.git    #我用的提交是cacf7f1d4e3d44d871b605da3b647f07d718623f
cd zlib
vim run.sh
#!/bin/bash

# 不支持直接改交叉编译链,需要在makefile中修改
ue=/home/user/bluetooth/bluetooth-build
export blue
./configure --prefix=$blue

打开Makefile,将默认的gcc编译器换成交叉编译器,添加编译标志-march=mips32r2 -muclibc

 chmod +x  run.sh
 ./run.sh
make
make install

7)编译 glib 库
注意,glib这里版本不能太低,否则在库中没有g_list_free_full的实现,在链接bluez的时候会报错,即需要用包含这个接口实现的版本

tar xvf glib-2.40.0.tar.xz
cd glib-2.40.0
vim run.sh
#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue

export NM=mips-linux-gnu-nm

echo glib_cv_long_long_format=ll>arm-linux.cache

echo glib_cv_stack_grows=no>>arm-linux.cache

echo glib_cv_working_bcopy=no>>arm-linux.cache

echo glib_cv_sane_realloc=yes>>arm-linux.cache

echo glib_cv_have_strlcpy=no>>arm-linux.cache

echo glib_cv_va_val_copy=yes>>arm-linux.cache

echo glib_cv_rtldglobal_broken=no>>arm-linux.cache

echo glib_cv_uscore=no>>arm-linux.cache

echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache

echo ac_cv_func_nonposix_getpwuid_r=no>>arm-linux.cache

echo ac_cv_func_posix_getgrgid_r=no>>arm-linux.cache

echo glib_cv_use_pid_surrogate=no>>arm-linux.cache

echo ac_cv_func_printf_unix98=no>>arm-linux.cache

echo ac_cv_func_vsnprintf_c99=no>>arm-linux.cache

echo ac_cv_path_GLIB_COMPILE_SCHEMAS=yes>>arm-linux.cache

./configure \
    --prefix=$blue \
    CC="mips-linux-gnu-gcc" \
    CXX="mips-linux-gnu-g++" \
    CFLAGS="-march=mips32r2 -muclibc  -I$blue/include -L$blue/lib" \
    CXXFLAGS="-march=mips32r2 -muclibc  -I$blue/include -L$blue/lib" \
    --host=mips-linux-gnu \
    --cache-file=arm-linux.cache
 chmod +x  run.sh
 ./run.sh

产生错误

checking for LIBFFI... no
configure: error: Package requirements (libffi >= 3.0.0) were not met:

No package 'libffi' found

解决方法

sudo apt-get install libffi-dev 
make
make install

8)编译termcap
编译bluez时在配置工程出错,config.log中提示找不到libtermcap

tar zxvf termcap-1.3.1.tar.gz
cd termcap-1.3.1/
vim run.sh
```bash
#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue

# 需要手动修改makefile中的编译链,编译标志
#CC="mips-linux-gnu-gcc" 
#CFLAGS="-march=mips32r2 -muclibc -I$blue/include -I../dbus-1.12.20 -L$blue/lib -L../dbus-1.12.20 " 
#LDFLAGS=" -march=mips32r2 -muclibc" 
./configure \
    --prefix=$blue \
    --host=mips-linux-gnu 
 chmod +x  run.sh
 ./run.sh
   make
   make insta

9)编译readline
解决配置时bluez时出现configure: error: readline header files are required的问题

tar xvf readline-7.0.tar.gz
cd readline-7.0/
vim run.sh
#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue

./configure \
    --prefix=$blue \
    CC="mips-linux-gnu-gcc -march=mips32r2 -muclibc -I$blue/include -L$blue/lib $blue/lib/libtermcap.a" \
    --host=mips-linux-gnu 
 chmod +x  run.sh
 ./run.sh
make
make install

10)编译libusb
解决编译bluez时tools/csr_usb.c:32:17: fatal error: usb.h: No such file or directory的问题
使用libusb-0.1.12的版本,更高的1.xx的版本中已经没有这个头文件了

tar xvf libusb-0.1.12.tar.gz
cd libusb-0.1.12/
vim run.sh
#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue

./configure \
    --prefix=$blue \
    CC="mips-linux-gnu-gcc -march=mips32r2 -muclibc  -I$blue/include -L$blue/lib" \
    --host=mips-linux-gnu \
    --disable-udev
 chmod +x  run.sh
 ./run.sh
make
make install

11)编译libical
解决编译bluez时出现obexd/plugins/phonebook-dummy.c:40:26: fatal error: libical/ical.h: No such file or directory的问题

git clone https://github.com/libical/libical.git				#使用的是5648155c53bd4bf4b191e02fe78bf90bc91bd849
cd libical
vim toolschain.cmake

# 设置目标系统
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR mips)

# 设置工具链目录
set(TOOL_CHAIN_DIR /usr/local/mips-gcc472-glibc216-64bit/)
# set(TOOL_CHAIN_INCLUDE
#     /arm-none-linux-gnueabi/sys-root/usr/include
#     /arm-none-linux-gnueabi/include
#     )
# set(TOOL_CHAIN_LIB
#     /arm-none-linux-gnueabi/sys-root/usr/lib
#     /arm-none-linux-gnueabi/lib
#     )

# 设置编译器位置
set(CMAKE_C_COMPILER mips-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER mips-linux-gnu-g++)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=mips32r2 -muclibc ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=mips32r2 -muclibc")
message( STATUS  ${CMAKE_C_FLAGS})
message( STATUS  ${CMAKE_CXX_FLAGS})
# 设置Cmake查找主路径
# set(CMAKE_FIND_ROOT_PATH /arm-none-linux-gnueabi)

# set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# 只在指定目录下查找库文件
# set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
# 只在指定目录下查找头文件
# set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# 只在指定目录下查找依赖包
# set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

# include_directories(
#   /usr/local/mips-gcc472-glibc216-64bit/mips-linux-gnu/include/c++/4.7.2/
#     )

 set(CMAKE_INCLUDE_PATH
     )

 set(CMAKE_LIBRARY_PATH
     )
vim run.sh
```bash
#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue

rm -rf build/
mkdir build/
cd build/

cmake \
  -DCMAKE_INSTALL_PREFIX=$blue  \
  -DCMAKE_BUILD_TYPE=Release   \
  -DSHARED_ONLY=yes            \
  -DGOBJECT_INTROSPECTION=false \
  --host=mips-linux-gnu \
  -DCMAKE_BUILD_TYPE=Debug \
  -DCMAKE_TOOLCHAIN_FILE=../toolschain.cmake \
  -DCMAKE_VERBOSE_MAKEFILE=ON \
  ..
vim CMakeLists.txt

在set(CMAKE_C_FLAGS xxx)后面加上编译标志

  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=mips32r2 -muclibc ")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=mips32r2 -muclibc")
chmod +x run.sh
./run.sh
cd build/
make
make install

12)编译 bluez

tar xvf bluez-5.0.tar.xz
cd bluez-5.0/
vim run.sh
#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue

./configure \
    --prefix=$blue \
    --host=mips-linux-gnu \
    CC="mips-linux-gnu-gcc" \
    CFLAGS="-march=mips32r2 -muclibc -I$blue/include -I../dbus-1.12.20 -I$blue/src -L$blue/lib -L../dbus-1.12.20" \
    LDFLAGS=" -march=mips32r2 -muclibc " \
    LIBS="$blue/lib/libtermcap.a" \
    --disable-udev \
    --disable-test 

chmod +x run.sh
./run.sh
make 
make install

验证

所有的库和编译出来的可执行文件均在$blue下,拷贝到板子上执行验证。

编译问题补充解决方案

一、glibc 中的报错

1、libffi not found
checking for LIBFFI... no
configure: error: Package requirements (libffi >= 3.0.0) were not met:

No package 'libffi' found

解决方案

sudo apt-get install libffi-dev
2、-Werror=format-nonliteral

在这里插入图片描述

gdate.c: In function 'g_data_strftime':
gdate.c:2497:7:7 error: format not a string literal, format string not checked [ -Werror=format-nonliteral]
                tmplen = strftime ( tmpbuf, tmpbufsize, locale_format, &tm);

解决方案:
在gdate.c的开头加入下面这句话忽略错误变成警告

#pragma GCC diagnostic ignored "-Wformat-nonliteral"

二、bluez中的错误

1、configure: error: USB library support is required
checking for USB... no
configure: error: USB library support is required

解决办法:安装libusb

sudo apt-get install libusb
2、找不到GLIb中的函数定义

在bluez的编译脚本中加入GLIB的路径

 GLIB_CFLAGS="-I$blue/include -I$blue/include/glib-2.0 -I$blue/lib/glib-2.0/include" \
 GLIB_LIBS="-L$blue/lib -lglib-2.0" \

修改之后完整的run.sh为:
run.sh

#!/bin/bash

blue=/home/user/bluetooth/bluetooth-build
export blue

./configure \
    --prefix=$blue \
    --host=mips-linux-gnu \
    CC="mips-linux-gnu-gcc" \
    CFLAGS="-march=mips32r2 -muclibc -I$blue/include -I../dbus-1.12.20 -I$blue/src -L$blue/lib -L../dbus-1.12.20" \
    LDFLAGS=" -march=mips32r2 -muclibc " \
    LIBS="$blue/lib/libtermcap.a" \
    GLIB_CFLAGS="-I$blue/include -I$blue/include/glib-2.0 -I$blue/lib/glib-2.0/include" \
    GLIB_LIBS="-L$blue/lib -lglib-2.0" \
    --disable-udev \
    --disable-test 

三、libusb

1、-Werror=format-truncation=
linux.c:28:48: error: '%s' directive output may be truncated writing up to 4096 bytes into a region of size 4095 [-Werror=format-truncation=]
   snprintf(filename, sizeof(filename) - 1, "%s/%s/%s",

解决方案: 在linux.c的开头加入下面这句话忽略错误,变成警告
###c
#pragma GCC diagnostic ignored “-Wformat-truncation”

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值