【Bluetooth|蓝牙开发】十一、一文秒懂 | 超详细的Bluez交叉编译

news/2024/4/19 8:34:27/文章来源:https://blog.csdn.net/dong__ge/article/details/127256340
img
个人主页:董哥聊技术
我是董哥,嵌入式领域新星创作者
创作理念:专注分享高质量嵌入式文章,让大家读有所得!
img

在这里插入图片描述

【 所有文章汇总】

1、 前言

前面几篇文章,主要讲解了蓝牙协议栈层面的内容,本篇来从源码层面来分析!

蓝牙协议栈,如何在代码层面将其落地?用的最多的就是开源的Bluez所实现的蓝牙协议栈了!

Bluez官网:http://www.bluez.org/

Bluez的交叉编译较为复杂,其依赖的文件之多,不失为一个练习交叉编译的好机会!

本文我们旨在研究交叉编译的手法,以一敌百,了解交叉编译的底层方法。

最后,文末也描述一种简单的编译方法,仅供了解。

 

2、安装包下载

前往Bluez官网,下载Bluez源码包

目前最新的是Bluez5.6.5版本,以该版本为案例进行分析。

wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.65.tar.xz		# 下载Bluez
tar -xvf bluez-5.65.tar.xz			# 解压bluez
cd bluez-5.64/						# 进入目录	

 

3、Bluez安装概览

首先,我们进入到bluez-5.65后,查看README文件,我们可以看到其依赖项:

In order to compile Bluetooth utilities you need following software packages:

  • GCC compiler
  • GLib library
  • D-Bus library
  • udev library (optional)
  • readline (command line clients)

由上可知,欲安装Bluez,需要对其依赖项进行逐一安装,下面我们依次进行安装!

 

4、安装步骤

mkdir bluez_output
cd bluez_output
export bluez_output=/home/dong/WorkSpace/Program/BlueZ/bluez_output		#设置环境变量

GCC交叉编译器,我们就直接忽略了哈……

 

4.1 GLib

GLib 是一个通用的、可移植的实用程序库,它提供了许多有用的数据类型、宏、类型转换、字符串实用程序、文件实用程序、主循环抽象等。

GLib官网:https://docs.gtk.org/glib

GLib下载地址:Gitlab下载、站点下载

我们下载的是glib-2.46.2.tar.gz

新版本的GLib需要Meson工具编译,因此我们这里使用2.46.2版本的,可以通过cmake编译

wget https://download.gnome.org/sources/glib/2.46/glib-2.46.2.tar.xz	#下载GLib
tar -xvf glib-2.46.2.tar.xz 			# 解压
cd glib-2.46.2/							# 进入目录

 

然后手动创建arm-linux.cache文件,手动写入下面内容:

touch arm-linux.cache		# 创建文件, 添加下面内容glib_cv_long_long_format=llglib_cv_stack_grows=noglib_cv_working_bcopy=noglib_cv_sane_realloc=yesglib_cv_have_strlcpy=noglib_cv_va_val_copy=yesglib_cv_rtldglobal_broken=noglib_cv_uscore=noac_cv_func_posix_getpwuid_r=yesac_cv_func_nonposix_getpwuid_r=noac_cv_func_posix_getgrgid_r=noglib_cv_use_pid_surrogate=noac_cv_func_printf_unix98=noac_cv_func_vsnprintf_c99=noac_cv_path_GLIB_COMPILE_SCHEMAS=yes

 

然后接着执行下面命令

./configure --prefix=$bluez_output CC="arm-linux-gnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib" --host=arm-linux-gnueabihf --cache-file=arm-linux.cache
make -j8
make install

 

如果报错:error: format not a string literal, format string not checked

可以看下面两篇文章,有解决方案

https://www.cnblogs.com/yuandaozhe/p/14365389.html

https://blog.csdn.net/wwwyue1985/article/details/113359706

如果报错:fatal error: ffi.h: No such file or directory

表明了GLib仍需要依赖libffi库,我们需要提前安装Libffi

 

4.1.1 libffi

libffi是可移植外部函数接口库,是构建GLib的先决条件。它是一个接口,允许用一种语言编写的代码调用用另一种语言编写的代码。

libffi下载路径:https://github.com/libffi/libffi/releases/

libffi下载版本:libffi-3.4.2.tar.gz

 

手动下载后,执行下面命令

tar -zxvf libffi-3.4.3.tar.gz		# 解压
cd libffi-3.4.3/					# 切换目录
./configure --prefix=$bluez_output CC="arm-linux-gnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib" --host=arm-linux-gnueabihf
make -j8
make install

安装完libffi后,再次回到GLib进行安装,可见报错:fatal error: zlib.h: No such file or directory

说明GLib仍然依赖zlib库,需要安装zlib

4.1.2 zlib

zlib是一个压缩库,是构建GLib的先决条件。

zlib下载地址:http://zlib.net/zlib-1.2.12.tar.gz

zlib下载版本:zlib-1.2.12.tar.gz

 

手动下载后,执行下面命令

tar -zxvf zlib-1.2.12.tar.gz
cd zlib-1.2.12/
./configure --prefix=$bluez_output --includedir=$bluez_output/include --libdir=$bluez_output/lib#vim Makefile 将CC变量改为自己的交叉编译器arm-linux-gnueabihf-gcc
CC=arm-linux-gnueabihf-gcc
LDSHARED=arm-linux-gnueabihf-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=arm-linux-gnueabihf-gcc -E
AR=arm-linux-gnueabihf-ar
RANLIB=arm-linux-gnueabihf-ranlibmake -j8
make install

安装完zlib后,再回头安装Glib,即可完毕!

 

4.2 D-Bus

D-Bus是一个用于进程间通信和协调的简单系统。

D-Bus下载目录:https://dbus.freedesktop.org/releases/dbus/

D-Bus下载版本:dbus-1.15.0.tar.xz

 

wget https://dbus.freedesktop.org/releases/dbus/dbus-1.15.0.tar.xz	# 下载
tar -xvf dbus-1.15.0.tar.xz				# 解压
cd dbus-1.15.0/							# 切换目录_____________________________________________________________	# 先看下文./configure --prefix=$bluez_output CC="arm-linux-gnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib" --host=arm-linux-gnueabihf --enable-selinux=no --without-x	# 生成Makefile
make -j8								# 编译
make install							# 安装到对应目录

我们先不着急安装,查看一下READMEINSTALL文件,发现D-bus的安装,必须依赖Expat库!

当然如果你直接安装,它也肯定会报错的,因为缺少所依赖的库!

Requisite:

  • Gettext
  • expat

Optional:

  • libselinux (for SELinux integration)
  • doxygen (for API documentation)
  • xmlto or meinproc4 (for Spec & other XML documentation)

下面我们来安装Expat库!

 

4.2.1 Expat

Expat是一个用C编写的XML解析器库,是D-Bus守护进程所需的惟一依赖项。

Expat下载路径:https://libexpat.github.io/,https://github.com/libexpat/libexpat/releases

Expat下载版本:expat-2.4.9.tar.xz

 

tar -zvf expat-2.4.9.tar.gz
cd expat-2.4.9/
./configure --prefix=$bluez_output CC="arm-linux-gnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib" --host=arm-linux-gnueabihf 
make -j8
make install

此时,会在$bluez_output目录下,看到安装后所生成的libinclude的一些文件

--enable-selinux=no --without-x 是一些配置信息,不适用selinuxx11支持,否则可能会报错!

安装完expat库后,我们回头安装D-bus

 

4.3 readline

Readline库提供了一组供应用程序使用的函数,并且允许用户在输入命令行时编辑它们。

下载地址:http://git.savannah.gnu.org/cgit/readline.git?h=devel

下载版本readline-8.2.tar.gz

wget http://git.savannah.gnu.org/cgit/readline.git/snapshot/readline-8.2.tar.gz
tar -xvf readline-8.2.tar.gz
cd readline-8.2/
./configure --prefix=$bluez_output CC="arm-linux-gnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib" --host=arm-linux-gnueabihf bash_cv_wcwidth_broken=yes
make -j8
make install

 

4.4 Bluez

安装完之后,我们就来安装最后的大Boss——``Bulez`

cd bluez-5.65/
mkdir output
./configure --prefix=$bluez_output CC="arm-linux-gnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib" PKG_CONFIG_PATH=$bluez_output/lib/pkgconfig --host=arm-linux-gnueabihf --disable-systemd --disable-udev --disable-cups --disable-obex --enable-library 
make SHLIB_LIBS=-lncurses -j8
make install

 

如果报类似以下错误

collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:5503: monitor/btmon] Error 1
/home/dong/WorkSpace/Program/BlueZ/bluez_output/lib/libreadline.so: undefined reference to `tputs'
/home/dong/WorkSpace/Program/BlueZ/bluez_output/lib/libreadline.so: undefined reference to `tgoto'
/home/dong/WorkSpace/Program/BlueZ/bluez_output/lib/libreadline.so: undefined reference to `tgetflag'
/home/dong/WorkSpace/Program/BlueZ/bluez_output/lib/libreadline.so: undefined reference to `UP'
/home/dong/WorkSpace/Program/BlueZ/bluez_output/lib/libreadline.so: undefined reference to `tgetent'
/home/dong/WorkSpace/Program/BlueZ/bluez_output/lib/libreadline.so: undefined reference to `tgetnum'
/home/dong/WorkSpace/Program/BlueZ/bluez_output/lib/libreadline.so: undefined reference to `PC'
/home/dong/WorkSpace/Program/BlueZ/bluez_output/lib/libreadline.so: undefined reference to `tgetstr'
/home/dong/WorkSpace/Program/BlueZ/bluez_output/lib/libreadline.so: undefined reference to `BC'

单看Log,肯定是readline库中缺少一些东西,这些东西就是缺少了ncurses库所导致的!

 

4.4.1 ncurses

ncursesreadline所依赖的一个库

下载地址:http://ftp.gnu.org/pub/gnu/ncurses

下载版本:ncurses-6.3.tar.gz

wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.3.tar.gz
tar -zxvf ncurses-6.3.tar.gz 
cd ncurses-6.3/
./configure --prefix=$bluez_output CC="arm-linux-gnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib"  CXX="arm-linux-gnueabihf-g++" --host=arm-linux-gnueabihf --without-cxx --without-cxx-binding --without-ada --without-manpages --enable-overwrite --without-debug --without-tests --with-shared --without-tests --without-progs
make -j8
make install

安装完ncurse后,我们再次安装readline,需要包含ncurse库!

 

4.4.2 readline

cd readline-8.2/
./configure --prefix=$bluez_output CC="arm-linux-gnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib" --host=arm-linux-gnueabihf bash_cv_wcwidth_broken=yes
make SHLIB_LIBS=-lncurses -j8
make install

 

4.4.3 bluez

ncurses安装后,再次回到bluez,执行安装步骤,并且引入ncurses库!

cd bluez-5.65/
mkdir output
./configure --prefix=$bluez_output CC="arm-linux-gnueabihf-gcc -I$bluez_output/include -L$bluez_output/lib -lncurses" PKG_CONFIG_PATH=$bluez_output/lib/pkgconfig --host=arm-linux-gnueabihf --disable-systemd --disable-udev --disable-cups --disable-obex --enable-library
make -j8
make install

至此,Bluez交叉编译结束!

 


简单一点的方法是什么?

就是通过构建工具来编译,直接通过类似于buildroot等类似的构建工具,直接选中bluez的外部包,直接编译也可以的:)

img
img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_398941.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

城区导航智能驾驶难在哪?写在小鹏/华为-极狐NOA释放之时

交流群 | 进“传感器群/滑板底盘群”请加微信号:xsh041388交流群 | 进“汽车基础软件群”请加微信号:ckc1087备注信息:群名称 真实姓名、公司、岗位【本文一万字左右,预计阅读时间约20分钟,文中有若干图片/GIF/视频&a…

猿创征文 | 国产数据库之PolarDB-X数据库详解安装和使用

文章目录1、PolarDB-X是什么?2、PolarDB-X架构3、PolarDB-X架构优势4、PolarDB-X核心特性5、PolarDB-X部署5.1、通过PXD部署集群5.2、通过 K8S 部署5.3、通过编译安装1、PolarDB-X是什么? PolarDB-X是由阿里巴巴自主研发的云原生分布式数据库&#xff0…

如何修复u盘?不如试试我这3个方法

u盘小小的一个便于我们携带,里面保存着我们很多数据。但是有时我们不小心清空了里面的数据,或者由于其他原因,导致u盘里的文件丢失,甚至出现打不开的局面。这时候该如何修复u盘?为了解答大家的疑惑,小编专门…

docker搭建主从架构和哨兵模式

下文介绍使用docker来创建redis的主从架构和哨兵模式 前提 linux已经下载并安装了docker 从仓库中pull redis的镜像 docker pull redis:latest确保主机中的镜像已经有了刚下载好的redis镜像 docker images架构图 一. docker创建redis的主从架构 1. 先创建一个master节点…

聚观早报 | 字节2021年亏损6041亿元;iPhone SE 4将采用刘海屏

今日要闻:字节2021年亏损6041亿元;iPhone SE 4或将采用刘海屏;京东众筹10月10日停止运营;特斯拉中国销量再创月度新高;大众将在中国成立软件合资企业字节2021年亏损6041亿元 10 月 10 日消息,字节跳动向员工…

FFmpeg基础:抽取视频文件中的音视频原始数据

文章目录视频流解码音频流解码原始的音视频数据数据量很大,为了方便传输和存储,我们会对原始数据进行压缩和编码。h264是常见的视频编码标准之一,AAC是常见的音频编码标准之一。这里介绍一下如何通过FFmpeg库将视频文件中的h264视频流解码成原…

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)

因为我是打包到手机端,并且使用的是前置摄像头 在Canvas默认的render mode(Screen Space - Overlay)下: 我想要使用 arcamera.WorldToScreenPoint(button.transform.position) 将Canvas下的button世界坐标转为屏幕坐标&#xff…

手把手教你搭建属于自己的第一个Maven项目并引入Spring容器依赖

前言 最近在学习Maven和Spring,在这里做个学习记录并且分享一些我自己的学习经验,对Maven和Spring感兴趣的小伙伴可以一起来学习,有任何问题也欢迎一起来交流讨论。 Spring简介 Spring框架由Rod Johnson开发,2004年发布了Sprin…

(附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

技术分享预告|DocArray x Redis 比快更快的向量搜索

从国内的学生开发者,到深入参与国际化开源社区。小燕主动出击,不放过任何一个贡献机会。快来看看原子能科学研究院核物理专业小姐姐的神仙输出!北京时间 10 月 11 号,本周二晚 10 点,小燕将在 Zoom 平台,面…

第03章 成人感冒不是大事,少往急诊跑

急诊是病菌最多的地方,能避则避我在安贞急诊工作了数个年头,最大的体会就是急诊像个大的农贸市场,每天人头攒动、人山人海、接踵摩肩、座无虚席、门庭若市、沸沸扬扬、热闹非凡、熙熙攘攘、车水马龙、人来人往……写了这么多词汇都不足以写出…

Redis(Jedis入门 Jedis连接池

本章导学: 什么是Jedis?Jedis入门案例 新建项目,导入依赖建立连接进行测试释放资源Jedis的连接池使用一、什么是Jedis Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C、php、Nod…

Spring IOC核心知识

控制反转(IOC: Inversion Of Control),把对象的创建和对象之间的调用过程都交给Spring管理,从而降低耦合度。 IOC底层原理 三大技术:XML解析、工厂模式、反射 IOC创建对象的过程: IOC重要接口 IOC容器底…

路径分析—QGIS+PostgreSQL+PostGIS+pgRouting(一)

前言 因业务需求,需要做最短路径分析。最近几天查询资料,并自己动手,实现了简单的路径分析。 下面就介绍具体的实现过程。 本篇文章最终结果是在 PostgreSQL 数据库中实现的,后续的可视化展示会继续跟进。 一、道路数据处理 如果你已经有了道路数据,那就直接使用。 由于当…

传统应用如何“丝滑”转型为云原生应用?

市场需求瞬息万变,传统型的应用逐渐无法满足业务侧要求,传统应用向云原生应用转型,已势在必行。本篇文章将介绍基于CloudOS(一站式云原生开发平台)如何实现传统应用向云原生应用的转型。 在此之前,我们需…

python基础(老师PPT)

slist [Alice,2019001, Geoscience, 95] # 使用分号加tab作为分隔符&#xff0c;连接字符串 print(;\t.join(slist))# a X if condition else Z # condition为True时&#xff0c;赋值为X&#xff0c;否则赋值为Z a, b 1, 2 c a > b if a > b else a < b print(c)…

分布式seata案例学习-2

上篇文章学习了如何安装seata&#xff0c;先学习如何使用 事务的4个特性ACID 事务特性 at模式详解 AT模式运行机制 AT模式的特点就是对业务无入侵式&#xff0c;整体机制分二阶段提交 两阶段提交协议的演变&#xff1a; 一阶段&#xff1a;业务数据和回滚日志记录在同一个本地…

【复习整理归纳】| C++面经网络相关(三)

文章目录计算机网络性能指标计算机在发送文件前需要做许多前期的工作分层结构概念OSI参考模型数据链路层ARP网络协议UDP套接字TCPTCP粘包三次握手四次握手为什么建立连接协议是三次握手&#xff0c;而关闭连接却是四次挥手呢&#xff1f;为什么TIME_WAIT状态还需要等2MSL后才能…

C++ | 12天学好C++ (Day 12)->结构图可视化、代码加通俗理解

为每天进步一点点而努力。 C是计算机视觉的重要的一部分&#xff0c;虽然在初始学习时Python应用比较广&#xff0c;但是大多数公司还是C做计算机视觉类的比较多&#xff0c;因为C可加密&#xff0c;所以我们来一起探索吧&#xff01;看了这系列博客&#xff0c;将会学到C的基…