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
下,拷贝到板子上执行验证。
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
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"
checking for USB... no
configure: error: USB library support is required
解决办法:安装libusb
sudo apt-get install libusb
在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
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”