树莓派使用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绑定:
- 先卸载系统里现有的gattlib包:
sudo apt remove --purge libgattlib-dev libgattlib0 sudo apt autoremove
- 克隆gattlib的官方源码:
git clone https://github.com/labapart/gattlib.git cd gattlib
- 创建编译目录并配置CMake,禁用Python绑定:
mkdir build && cd build cmake -DGATTLIB_BUILD_PYTHON_BINDING=OFF ..
- 编译并安装:
make -j$(nproc) sudo make install sudo ldconfig
- 重新编译你的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
相关产品推荐
相关产品推荐

