You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派使用gattlib扫描BLE设备时卡在gattlib_adapter_scan_enable,且出现未预期的Python相关致命错误

树莓派使用gattlib扫描BLE设备时卡在gattlib_adapter_scan_enable,且出现未预期的Python相关致命错误

看起来你遇到的问题挺反常的——明明写的是纯C++代码,却触发了Python的GIL锁错误,扫描函数还直接卡住了。我来帮你拆解下原因和解决办法:

核心问题根源

树莓派官方软件源里的gattlib库默认编译了Python绑定,哪怕你用C++调用,程序运行时也会自动加载Python相关的依赖库。当gattlib_adapter_scan_enable内部启动线程处理扫描逻辑时,就会触发Python全局解释器锁(GIL)的冲突,进而导致你看到的致命错误。

解决方案:重新编译不带Python绑定的gattlib

要彻底解决这个问题,最好从源码编译一个纯C/C++版本的gattlib,明确禁用Python绑定:

  1. 先卸载系统里现有的gattlib包:
sudo apt remove --purge libgattlib-dev libgattlib0
sudo apt autoremove
  1. 克隆gattlib的官方源码:
git clone https://github.com/labapart/gattlib.git
cd gattlib
  1. 创建编译目录并配置CMake,禁用Python绑定:
mkdir build && cd build
cmake -DGATTLIB_BUILD_PYTHON_BINDING=OFF ..
  1. 编译并安装:
make -j$(nproc)
sudo make install
sudo ldconfig
  1. 重新编译你的BLE扫描代码:
g++ blescan.cpp -o blescan -lgattlib

额外优化建议

  • 编译完成后,可以用ldd ./blescan检查可执行文件的依赖,确认里面没有Python相关的库(比如libpython*.so),这就说明编译成功了。
  • 你的代码里用了std::mutex,其实gattlib_adapter_scan_enable本身就是阻塞式函数(会在超时后自动返回),这个锁其实可以去掉,不会影响扫描的同步性。

验证运行

重新运行你的程序,应该就能正常看到check 2a和check 3的输出,也不会再出现Python相关的错误了。

备注:内容来源于stack exchange,提问作者hwas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 12:49:30