Bluez交叉编译-bluez4.101

本文详细介绍了蓝Z交叉编译的过程,包括环境变量设置、关键库编译(如Expat、D-bus、glib等)、以及蓝Z自身的编译步骤。提供了一个完整的交叉编译流程,适合初学者理解和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一篇博客!自己弄东西时,看到很多网友的帖子,对在下帮助甚大。这里奉献下自己的成果经验。本人菜鸟,如有不对之处,欢迎指出。

对于bluez的交叉编译,网上有很多,但是大部分都是编译bluez-utils这个bluez的工具包,但是bluez4.48之后的版本,都是将工具包包含在内的,所以不需要编bluez-utils了。实在是编那个的时候总是有问题。下面的两个网站上,有很全的编译过程(但不是交叉编译)和各种库的下载

http://www.linuxfromscratch.org/blfs/view/stable/general/bluez.html    ——这个是bluez4.101
http://www.linuxfromscratch.org/blfs/view/svn/general/bluez.html         ——这个是bluez5.21

Bluez4.101交叉编译的具体步骤
首先确定安装目录,安装目录最好不是用户目录,以免有权限限制.
先进行环境变量的设置,告诉之后系统,我的库安装的目录
export PKG_CONFIG_PATH=/path/usr/lib/pkgconfig

Expat
./configure --prefix=/path/usr --host=arm-linux-gnueabihf
&& make
sudo make install

这个库是较好编的,其中path就是你编译bluez需要存放的地址,所有编译的库需存放在同一个目录下,最后可将编译好的bluez这个文件夹,直接copy到开发板的内存中,可直接使用


D-bus
./configure
CFLAGS=-I/path/usr/include LDFLAGS=-L/path/usr/lib  
--prefix=/path/usr
--host=arm-linux-gnueabihf  \    
--with-x=no && make
sudo make install



glib(之前要通过源程序装zlib和apt-get libglib2.0-dev)
export PKG_CONFIG_LIBDIR=/path/usr/lib/pkgconfig/
CC=arm-linux-gnueabihf-gcc
./configure \
    --host=arm-linux-gnueabihf \
    --prefix=/path/usr \
    --disable-installed-tests \
    ac_cv_type_long_long=yes \
    glib_cv_stack_grows=no \
    glib_cv_uscore=no \
    ac_cv_func_posix_getpwuid_r=yes \
    ac_cv_func_posix_getgrgid_r=yes && make


bluez-4.101   jiaocha(ok)
export PKG_CONFIG_LIBDIR=/path/usr/lib/pkgconfig/
mkdir -p /path/lib/systemd/system
mkdir -p /path/usr/lib/systemd
CC=arm-linux-gnueabihf-gcc
 ./configure  \
    --host=arm-linux-gnueabihf \
    --with-systemdsystemunitdir=/path/lib/systemd/system/ \
    --with-systemduserunitdir=/path/usr/lib/systemd \
    --prefix=/path/usr \
    --with-dbussystembusdir=/path \
    --disable-udev \
    --enable-experimental \
  #  LDFLAGS=-lncurses \加上的话,C无法产生可执行文件(这里也可能是我这两个环境变量给的值出现了问题,如有大神知道,欢迎批评指正)
  #  CFLAGS=-I/path/include
&& make

<think>我们正在解决BlueZ编译过程中出现的与libreadline相关的链接错误。错误信息类似于“undefinedreferenceto`PC'”,这通常是由于链接器无法找到readline中某些符号(特别是PC)的定义。根据引用[2]中提到的lua编译问题,类似的错误可能是由于readline与ncurses的链接顺序问题或版本不兼容导致的。###问题分析在编译BlueZbluez-5.50)时,如果出现以下错误:```libreadline.so:undefinedreferenceto`PC'```这通常意味着:1.**链接顺序不正确**:在链接时,readline需要在ncurses之前指定,因为readline依赖于ncurses。2.**readline版本不兼容**:系统中安装的readline可能是新版本(如8.x),而编译脚本期望的是旧版本(如6.x)的符号。3.**缺少必要的依赖**:系统可能缺少ncurses或tinfo(ncurses的一部分)。引用[1]中提到了多个找不到的问题(libreadline.so.6,libncurses.so.5等),这表明系统可能缺少这些或者版本不对应。引用[2]中的解决方法是显式地在链接时加上`-lreadline-lncurses`,并注意顺序。###解决方案步骤####1.安装必要的依赖确保系统安装了readline和ncurses的开发包。以Ubuntu为例:```bashsudoapt-getinstalllibreadline-devlibncurses5-dev```对于其他发行版,请使用相应的包管理命令(如yum,dnf等)。####2.检查文件是否存在确认文件在系统中存在:```bash#检查readlinels/usr/lib/x86_64-linux-gnu/libreadline.so#检查ncursesls/usr/lib/x86_64-linux-gnu/libncurses.so```如果不存在,可能需要安装对应版本的。####3.修改BlueZ的配置脚本在编译BlueZ时,可能需要调整链接的顺序。编辑`configure`脚本或`Makefile`,确保链接顺序为`-lreadline-lncurses`(先readline后ncurses)。如果BlueZ使用autotools构建,可以在配置时通过环境变量指定链接:```bash./configureLIBS="-lreadline-lncurses"```或者,如果已经运行过configure,可以修改生成的`Makefile`,找到`BLUEZ_LIBS`变量,并调整的顺序。####4.显式添加链接如果步骤3不成功,可以尝试在Makefile中显式添加`-ltinfo`(tinfo是ncurses的一部分):```bash./configureLIBS="-lreadline-lncurses-ltinfo"```####5.使用旧版readline(如果必要)如果系统中readline版本过高(如8.x),而BlueZ需要旧版符号(如readline6.x),可以尝试安装旧版readline开发包,并在配置时指定:```bashsudoapt-getinstalllibreadline6-dev./configureLIBS="-lreadline6-lncurses"```####6.重新编译并安装```bashmakecleanmakesudomakeinstall```###关键点说明-**链接顺序**:由于readline依赖于ncurses,因此readline必须放在ncurses之前。链接器按顺序解析符号,如果先链接ncurses,则readline中的符号(如PC)可能无法解析。-**版本**:如果错误信息中提到了特定版本(如libreadline.so.6),则需要安装对应版本的开发包。###验证编译完成后,使用`ldd`检查生成的BlueZ可执行文件是否链接了正确的:```bashldd/path/to/bluetoothd|grepreadline```应该能看到类似`libreadline.so.6=>/lib/x86_64-linux-gnu/libreadline.so.6`的输出。---§§相关问题§§1.如何检查Linux系统中已安装的readline版本?2.在编译软件时如何正确指定链接的顺序?3.如何解决其他常见的“undefinedreference”链接错误?4.BlueZ编译过程中可能遇到的其他常见错误有哪些?5.如何为不同的Linux发行版安装readline和ncurses开发包?</think>## 解决 BlueZ 5.50 编译中 "libreadline.so undefined reference to PC" 错误 ### 问题分析 错误 `undefined reference to PC` 表明 BlueZ 在链接阶段无法找到 readline 中的 `PC` 符号。这是典型的链接顺序问题或版本不兼容问题,常见原因包括: 1. **链接顺序错误**:readline 需要在 ncurses/tinfo **之后** 链接 2. **版本不匹配**:系统安装的 readline/ncurses 版本与编译需求不兼容 3. **符号缺失**:新版本 readline 移除了 `PC` 等传统符号(参考引用[2]) --- ### 解决方案步骤 #### 1. 安装必需依赖 ```bash # Ubuntu/Debian sudo apt install libreadline-dev libncurses5-dev libtinfo5 libssl-dev # CentOS/RHEL sudo yum install readline-devel ncurses-devel openssl-devel ``` #### 2. 修改 BlueZ 编译配置 编辑 BlueZ 源码目录中的 `Makefile` 或 `configure` 文件: ```makefile # 在 LIBS 变量中添加 -lreadline -ltinfo -lncurses LIBS += -lreadline -ltinfo -lncurses # 确保链接顺序正确(readline 必须在 ncurses 之后) LIBS = ... -lncurses -lreadline ... ``` #### 3. 编译时显式指定链接 如果通过 `configure` 编译,添加链接参数: ```bash ./configure LIBS="-lreadline -ltinfo -lncurses" \ LDFLAGS="-L/usr/lib/x86_64-linux-gnu" ``` #### 4. 解决符号缺失问题(关键步骤) 对于较新的 readline 版本(>7.0),需要添加兼容性定义: ```c // 在 BlueZ 源码中创建 compat_readline.c 文件 #include <readline/readline.h> // 提供缺失的 PC 符号 char *PC = NULL; // 编译时包含此文件 gcc ... -c compat_readline.c ``` #### 5. 验证修复 ```bash make clean make # 检查是否仍有 undefined reference 错误 ``` --- ### 链接顺序原理 正确的链接顺序至关重要: ``` 应用程序 → readline → ncurses/tinfo → 系统 ``` 错误顺序会导致: ``` 应用程序 → readline → 缺失符号(PC等) ``` ### 版本兼容方案 | 系统环境 | 解决方案 | |-----------------------|-----------------------------| | Readline < 7.0 | 正常链接无需补丁 | | Readline ≥ 7.0 | 添加 `PC` 兼容定义 | | 缺少 libtinfo | 安装 ncurses-libs 或兼容包 | > ⚠️ **注意**:Ubuntu 20.04+ 和 CentOS 8+ 默认使用 readline 8.x,必须添加兼容性符号定义(参考引用[2]中Lua的类似问题) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值