dbus/Qt移植arm:No such signal ::DeviceAdded(QString) 和 system_bus_socket不存在 解决

本文记录了解决Qt程序通过DBus检测U盘时遇到的问题,包括交叉编译、库文件配置、dbus-daemon启动及权限设置等过程。

qt利用dbus检测U盘程序交叉编译无误后,拷贝到板子里,运行报错:

"?????????QDBusInterface?" "Failed to connect to socket /usr/local/arm/dbus-1.0.
2/var/run/dbus/system_bus_socket: No such file or directory"
Object::connect: No such signal QDBusAbstractInterface::DeviceAdded(QString)
Object::connect: (receiver name: 'Widget')
Object::connect: No such signal QDBusAbstractInterface::DeviceRemoved(QString)
Object::connect: (receiver name: 'Widget')

我们看最上面一句是说找不到system_bus_socket这个文件,板子上确实没有,在上篇文章里说过, 我只拷了dbus的那三个库。于是我把PC上整个dbus-1.0.2的库都拷到板子上,可是奇怪的是我在pc上按上面的路径,发现dbus目录下为空,根本没有生成system-bus_socket.怎么回事?这说明我们交叉编译安装的时候,出问题了!nnd,只有重新交叉编译安装了:

1,

./configure --host=arm-linux --prefix=/root/bluez_install/dbus-1.0.2 CC=arm-linux-gcc --cache-file=arm-linux.cache --without-x
如果后面不加--without-x在make的时候会报错:
dbus-launch.c: In function 'kill_bus_when_session_ends':

dbus-launch.c:413:7: error: impossible constraint in 'asm' dbus-launch.c:414:7: error: impossible constraint in 'asm' make[2]: *** [dbus-launch.o] 错误 1 make[2]: 离开目录“/home/yan/download/dbus-1.0.2/tools” make[1]: *** [all-recursive] 错误 1 make[1]: 离开目录“/home/yan/download/dbus-1.0.2” make: *** [all] 错误 2

解决:原来./configure 一定要加"--with-x=no

2,./configure过程中报错:

checking abstract socket namespace... configure: error: cannot run test program while cross compiling

解决:echo ac_cv_have_abstract_sockets=yes>arm-linux.cache
export PKG_CONFIG_PATH=/usr/lib/pkgconfig

3,make时候报错:

make[3]: *** [dbus-sysdeps-unix.lo] 错误 1
make[3]:正在离开目录 `/root/桌面/Qt/bluez源/dbus-1.0.2/dbus'
make[2]: *** [all] 错误 2make[2]:正在离开目录 `/root/桌面/Qt/bluez源/dbus-1.0.2/dbus'
make[1]: *** [all-recursive] 错误 1
make[1]:正在离开目录 `/root/桌面/Qt/bluez源/dbus-1.0.2'make: *** [all] 错误 2
解决办法:打开dbus/dbus-sysdeps-unix.c
添加:
struct ucred
{
pid_t pid; /* PID of sending process. */
uid_t uid; /* UID of sending process. */
gid_t gid; /* GID of sending process. */
};
经过三个步骤交叉编译出dbus后,打开
/usr/local/arm/dbus-1.0.
2/var/run/dbus/

竟然还是找不到system_bus_socket, NND,真恼火,究竟是咋回事??????????????????????????

原来是需要运行:dbus-daemon --system,这个时候var/run/dbus下面还是什么也没有,但是在终端里(pc上的,现在还没到移植到arm)用ls命令一查看,发现var/run文件夹下很多东西,原来这个文件夹下的东西是隐藏。在看dbus下面也有sysytem_bus_socket这个文件了!下面就打包移植!

它奶奶的,弄到板子上错误依旧!而且我发现,pc上var/run/dbus下面即便用命令ls查看也什么都没有了!万念俱灰啊!

痛定思痛,仔细阅读了几乎google的所有文章,有用的有几篇:

http://note.sdo.com/u/422029744/n/p9WCM~jXIebOwE04g005D3

http://blog.chinaunix.net/space.php?uid=21931055&do=blog&id=328769

http://hi.baidu.com/lihuanhai1943/blog/item/00ef57faf02907dab58f3113.html

这才知道dbus-1.0.2文件下的bin文件是有作用的,dbus拷贝到板子上后是需要配置的。dbus下的bin里面的dbus-daemon是个很关键的东西,貌似必须用他来启动dbus。

那就切换到bin下运行:./dbus-daemon --system.

报错如下:

Failed to start message bus: Could not get UID and GID for username "messagebus

这时我试了下adduser这个命令,竟然可以用在我的Tiny210开发板上!那就赶紧:[root@FriendlyARM bin]# adduser messagebus

会提示出入密码.密码设好后,再次运行./dbus-daemon --system竟然没有报错,去查看下system_bus_socket也存在了!这可是在板子上哦,不容易啊!


接着运行我的qt检测U盘程序,这次继续报错,只不过错误不一样了:

"?????????QDBusInterface?" "The name org.freedesktop.Hal was not provided by any
.service files"
Object::connect: No such signal QDBusAbstractInterface::DeviceAdded(QString)
Object::connect: (receiver name: 'Widget')
Object::connect: No such signal QDBusAbstractInterface::DeviceRemoved(QString)
Object::connect: (receiver name: 'Widget')

一个小小的qt检测U盘插拔竟让我费了这么大劲,不知道网上那些寥寥数语就实现此功能的神人,怎么弄出来的。欲知后事如何下回分解把。洒家再研究吧。





<think>我们正在处理一个系统错误:"Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory" 这个错误通常发生在尝试使用DBus(消息总线系统)时,但DBus守护进程没有运行,或者所需的套接字文件存在解决步骤可能包括: 1. 检查DBus服务状态 2. 启动DBus服务 3. 确保DBus服务在启动时运行 4. 检查套接字文件是否存在,并确保权限正确 由于用户是在Linux环境下遇到此问题,我们将提供相应的命令行解决步骤。 注意:需要管理员权限(使用sudo)来执行服务管理命令。 具体步骤: 步骤1:检查DBus服务状态 我们可以使用systemctl来检查dbus服务的状态(在大多数使用systemd的Linux发行版中): 命令:`systemctl status dbus` 如果服务没有运行,我们会看到状态为inactive(或者failed)。如果服务正在运行,那么我们可能需要检查套接字文件的权限。 步骤2:启动DBus服务 如果DBus服务没有运行,我们可以尝试启动它: 命令:`sudo systemctl start dbus` 步骤3:设置DBus服务开机启动 为了确保以后重启后DBus会自动启动,我们可以启用它: 命令:`sudo systemctl enable dbus` 步骤4:检查套接字文件 如果服务已经运行,但问题仍然存在,我们可以检查套接字文件: 文件路径:`/run/dbus/system_bus_socket` 我们可以使用ls命令检查: 命令:`ls -l /run/dbus/system_bus_socket` 如果文件存在,可能是DBus服务没有正确启动。如果存在,可能是权限问题,通常这个文件的所有者应该是dbus用户,权限为rw-rw-rw-(但实际上权限可能更严格,比如rw-r--r--)。我们可以尝试重启DBus服务:`sudo systemctl restart dbus` 步骤5:检查DBus服务日志 如果问题仍然没有解决,查看DBus服务的日志: 命令:`journalctl -u dbus` 步骤6:重新安装DBus(如果上述步骤都失败) 在极少数情况下,可能DBus软件包损坏,可以尝试重新安装: 例如在Debian/Ubuntu上:`sudo apt install --reinstall dbus` 在CentOS/RHEL上:`sudo yum reinstall dbus` 注意:重新安装DBus通常会影响系统配置,因为配置文件在/etc目录下,通常会被覆盖(除非使用强制选项)。但为了安全,可以备份/etc/dbus-1目录。 由于用户的问题描述中提到了“参考站内引用”,但我们没有具体的引用内容,因此根据常见的系统管理知识提供上述步骤。 另外,这个错误可能出现在某些特定的操作之后,比如系统升级或者配置更改,因此询问用户最近是否做过类似操作可能有助于诊断。 然而,根据用户要求,我们直接提供解决方法。 生成相关问题: 1. 如何检查Linux系统中服务的状态? 2. DBus在Linux系统中起什么作用? 3. 除了systemctl,还有哪些命令可以管理Linux服务? 4. 如何查看Linux系统日志来诊断问题? </think>### 解决 "Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory" 错误的方法 此错误表明系统无法访问 D-Bus 系统总线套接字文件,通常由以下原因导致: #### 1. **检查 D-Bus 服务状态** ```bash systemctl status dbus.service dbus.socket ``` - 如果服务未运行(显示 `inactive`): ```bash sudo systemctl start dbus.service sudo systemctl enable dbus.service # 确保开机自启 ``` #### 2. **验证套接字文件存在性** ```bash ls -l /run/dbus/system_bus_socket ``` - 若文件存在: ```bash sudo systemctl restart dbus.service # 强制重建套接字 ``` #### 3. **检查特权模式(容器环境常见问题)** - Docker 容器需添加 `--privileged` 标志: ```bash docker run --privileged -it your_image ``` - Podman 容器需启用 DBus: ```bash podman run --systemd=always -it your_image ``` #### 4. **修复文件系统权限** ```bash sudo chown root:messagebus /run/dbus sudo chmod 1777 /run/dbus ``` #### 5. **重建 D-Bus 配置** ```bash sudo dbus-uuidgen --ensure # 生成唯一ID sudo systemctl daemon-reload sudo systemctl restart dbus.service ``` #### 6. **检查 SELinux/AppArmor(高级系统)** - 临时禁用 SELinux: ```bash sudo setenforce 0 ``` - 检查审计日志: ```bash sudo ausearch -m avc -ts recent ``` > **验证修复**: > ```bash > dbus-send --system --dest=org.freedesktop.DBus --type=method_call --print-reply / org.freedesktop.DBus.ListNames > ``` > 成功应返回系统总线上的服务列表[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值