`

交叉编译dbus模块到Qt 遇到的错误及解决

阅读更多

      由于用qt来检测U盘插拔,要用dbus。pc调试通过后,发现到板子里没有dbus。原来默认情况下,编译arm版本qt时是不带dbus的,因此要重新交叉编译qt。

我的配置:

./configure -prefix /usr/local/arm/arm2-qt-4.8.1 -opensource -embedded arm -xplatform qws/linux-arm-g++  -no-webkit -qt-libtiff -qt-libmng -qt-mouse-tslib -qt-mouse-pc -no-mouse-linuxtp -no-neon -nomake examples -nomake docs -nomake demos -nomake tools -no-qt3support -dbus

版本为qt4.8.1,注意最后的“-dbus”就是让qt带dbus模块。

         结果报错:The QtDBus module cannot be enabled because libdbus-1 version 0.93 was not found. 说需要一个libdbus-1,yum install了一下,发现这个东西已经安装了在pc上,否则我程序在pc下也不会跑通。只是没有嵌入式版本的,需要自己用源码交叉编译。

     我下载的dbus源码的版本是1.0.2,看到网上移植这个的多。首先新建一个文件夹,mkdir /usr/local/arm/dbus-1.0.2,然后解压源码,进到dbus-1.0.2目录里,输入:

./configure --host=arm-linux --prefix=/usr/local/arm/dbus-1.0.2 CC=arm-linux-gcc --cache-file=arm-linux.cache --without-x 

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

解决:1,首先用locate pkgconfig查看下pkgconfig安装了没有,一般都安装了。找到路径配置到环境变量里:export PKG_CONFIG_PATH=/usr/lib/pkgconfig

2,光设这个环境变量还是不行的,在终端里输入:

#echo ac_cv_have_abstract_sockets=yes>arm-linux.cache

之后,./configure通过!

然后make,

报错如下

make[3]: *** [dbus-sysdeps-unix.lo] 错误 1
make[3]: 离开目录“/home/yan/download/dbus-1.0.2/dbus”
make[2]: *** [all] 错误 2
make[2]: 离开目录“/home/yan/download/dbus-1.0.2/dbus”
make[1]: *** [all-recursive] 错误 1
make[1]: 离开目录“/home/yan/download/dbus-1.0.2”
make: *** [all] 错误 2

解决:进到dbus-1.0.2目录下的dbus目录,gedit 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. */
};
注意上面最后的“;”要带的。

之后make ,make install一路顺利!

进入到dbus的-prefix的目录查看下是否安装完了,截图如下:



     接下来就是要切换到qt的解压缩目录,重新./configure,在-dbus后面加上路径。也就是两个 -I 和一个 -L 。坑爹的是网上没人说清这一点,有人自己搞出来了说的模棱两可。我本来是按照安装目录里dbus-1.0.2找到include和lib,分别把里面的最深目录配置进去,发现总是错误。原来根本不是这么回事!找到-prefix目录下的lib文件下的pkgconfig文件夹,打开dbus-1.pc,里面内容如下:

prefix=/usr/local/arm/dbus-1.0.2
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
system_bus_default_address=unix:path=/usr/local/arm/dbus-1.0.2/var/run/dbus/system_bus_socket
sysconfdir=/usr/local/arm/dbus-1.0.2/etc
session_bus_services_dir=/usr/local/arm/dbus-1.0.2/share/dbus-1/services

Name: dbus
Description: Free desktop message bus
Version: 1.0.2
Libs: -L${libdir} -ldbus-1  
Cflags: -I${includedir}/dbus-1.0 -I${libdir}/dbus-1.0/include
    重点看最后两句,这里-L和-I并没有配置到最深目录。(坑爹的是网上有人说要配置到最深目录,还有人说要改这个dbus-1.pc文件,NND!发火)仿照上面最后两句, 正确的-dbus后的参数应该是:

-dbus -dbus-linked -I/usr/local/arm/dbus-1.0.2/include/dbus-1.0 -I/usr/local/arm/dbus-1.0.2/lib/dbus-1.0/include -L/usr/local/arm/dbus-1.0.2/lib -ldbus-1 -lpthread -lrt

保险起见,export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/arm/dbus-1.0.2/lib/pkgconfig 把dbus的pkgconfig这个文件夹路径配置进去,这一步不弄应该也可以!

最终的qt的./configure内容是:

./configure -prefix /usr/local/arm/arm2-qt-4.8.1 -opensource -embedded arm -xplatform qws/linux-arm-g++  -no-webkit -qt-libtiff -qt-libmng -qt-mouse-tslib -qt-mouse-pc -no-mouse-linuxtp -no-neon -nomake examples -nomake docs -nomake demos -nomake tools -no-qt3support -dbus -dbus-linked -I/usr/local/arm/dbus-1.0.2/include/dbus-1.0 -I/usr/local/arm/dbus-1.0.2/lib/dbus-1.0/include -L/usr/local/arm/dbus-1.0.2/lib -ldbus-1 -lpthread -lrt

    然后就是make、make install,将生成的lib文件夹,打包压缩,拷贝到板子里再解压放到相应位置就可以了!如有疑问,参考我前几篇博客。


分享到:
评论

相关推荐

    qt for windows版本下编译qtdbus模块

    ### Qt for Windows 版本下编译 QtDBus 模块 #### 背景与目的 Qt 是一个跨平台的应用程序开发框架,广泛应用于桌面应用的构建。Qt 提供了一系列的功能模块来支持开发者的需求,其中之一就是 QtDBus。QtDBus 是用于...

    交叉编译dbus/glib/dbus-glib

    . ├── dbus-1.12.20.tar.gz ├── dbus-glib-0.106.tar.gz ├── expat-2.3.0.tar.bz2 ├── glib-2.34.1.tar.xz ├── libffi-3.3.tar.gz ├── README └── zlib-1.2.11.tar.gz

    ARM平台下交叉编译的DBUS1.2的代码和库

    在ARM平台上交叉编译DBUS1.2,可以为基于Linux的移动设备提供强大的通信支持。 首先,"dbus-1.2.16"是DBUS1.2的源代码包,包含了所有必要的头文件、源代码和配置脚本。解压这个文件后,开发者可以看到如下的目录...

    QtDbus资料集合

    QtDbus是Qt框架下与DBus交互的模块,它允许Qt应用程序与其他进程通过DBus协议进行通信。DBus是一种轻量级的消息传递系统,常用于Linux和其他类UNIX系统中的进程间通信(IPC)。QtDbus提供了方便的API,使得Qt开发者...

    QT DBUS通讯小程序

    首先,理解QT的DBus模块是至关重要的。QT为DBus提供了一个直观的API,使得开发者可以方便地集成DBus功能到他们的应用程序中。通过QT的QDBus namespace,我们可以创建DBus服务、连接到已存在的服务、发送和接收DBus...

    QT中DBUS的用法

    QT的DBUS模块提供了一系列的类和函数,如`QDBusConnection`、`QDBusInterface`、`QDBusServiceWatcher`等,帮助开发者与DBUS交互。 1. **建立连接**:使用`QDBusConnection`类来建立与DBUS总线的连接。通常有系统...

    Qt5.4.2 交叉编译器4.5.1 交叉编译过程文档

    - 在进行交叉编译前,请确保已经正确安装了所需的工具链及库文件,如 `arm-linux-gcc 4.5.1` 编译器、tslib 和 dbus 库等。 - 对于 `-lts` 选项,这表示在链接阶段需要链接 tslib 库。如果你的项目不需要触摸屏支持...

    qt5 Dbus编译号的库

    Qt5 Dbus编译库是将Qt框架与DBus通信机制相结合的一种实现,使得Qt应用程序能够利用DBus进行进程间通信(IPC)。DBus是一种轻量级的消息总线系统,广泛用于Linux和其他Unix-like操作系统中,允许不同应用程序之间...

    已经交叉编译好的arm64版本的qt5.12.1以及qtmqtt的完整产物

    Configuration: cross_compile use_gold_linker compile_examples enable_new_dtags largefile neon precompile_header shared rpath release c++11 c++14 concurrent dbus reduce_exports stl Build options: Mode...

    QT中dbus的应用程序

    1. **安装库和配置环境**:确保已经安装了Qt5DBus模块,这是Qt对DBus的支持库。在qmake项目文件中包含`QT += dbus`,以启用DBus功能。 2. **定义XML接口**:DBus的接口定义通常在XML文件中完成,描述了对象的路径、...

    qt交叉编译环境搭建方法

    Qt交叉编译环境搭建方法 Qt 是一个功能强大且广泛应用的跨平台应用程序开发框架,广泛应用于嵌入式系统、移动设备、桌面应用程序等领域。然而,想要在嵌入式系统上运行 Qt 程序,需要搭建交叉编译环境。本文将指导...

    Qt中DBus通讯方式(Adaptor-interface方式)

    DBus通讯方式中,设置适配器Adaptor和Interface的通讯方式比较麻烦,重点在于适配器类(Adaptor类)和接口类(Interface类)的生成,Qt有工具可以自动生成相应的类。※建议Qt中DBus通讯使用Interface-Connection方式...

    QT 的应用程序间的DBUS通信

    QT的DBus通信是一种在不同应用程序之间进行交互的技术,它基于DBus协议,允许Qt应用程序通过系统总线或自定义总线相互通信。DBus是Linux和其他类UNIX系统中的一个消息总线服务,它使得进程间通信(IPC)变得更加简单...

    Qt中DBus的Adaptor-interface通讯方式

    DBus通讯方式中,设置适配器Adaptor和Interface的通讯方式比较麻烦,重点在于适配器类(Adaptor类)和接口类(Interface类)的生成,Qt有工具可以自动生成相应的类。※建议Qt中DBus通讯使用Interface-Connection方式...

    dbus绿色版支持Windows10,基于dbus-1.13.6编译

    DBus,全称Desktop Bus,是Linux桌面环境中的一个核心组件,用于进程间通信(IPC,Inter-Process ...无论是为了测试、开发还是其他目的,这个编译好的版本都能为Windows平台带来更丰富的进程间通信解决方案。

    海思 16dv300 Bluez5.50 一键交叉编译包

    包含所需的库:zlib-1.2.11 libffi-3.0.13 gettext-0.19.8.1 glib-2.40.0 ncurses-5.9 ...编译ncurses-5.9过程中 会有一个错误,解决方法参考 https://blog.csdn.net/u014449366/article/details/73250513

    qt dbus 1.10.6编译所需的依赖库

    在编译过程中,如果遇到缺少依赖的情况,系统会提示错误信息,按照提示安装相应的包即可。如果你使用的是"使用方式.txt"文档,里面应该包含了详细的编译和安装指南,务必仔细阅读并遵循其中的步骤。 总的来说,编译...

    bluez蓝牙协议栈交叉编译移植教程

    在整个交叉编译过程中,可能会遇到诸如依赖库版本不匹配、交叉编译器版本过高或过低的问题。例如,在编译**glib**时,可能需要先安装`gettext`和`libglib2.0-dev`,并通过修改`arm-linux.cache`文件来适应特定的配置...

    Qt中DBus通讯方式(Interface-Connection方式)

    D-Bus是一种高效低耗的进程间...Qt中QDBus的Interface-Connection通讯方式方式相比于Adaptor-Interface方式较为简单,这种方式不需要XML文件,也不需要自动生成的adaptor类和Interface类,给用户提供更简便的使用方式。

    编译qt-everywhere-opensource-src-4.8.0-tp

    创建一个名为 `arm-linux.cache` 的文件,用以解决 `malloc` 编译时的错误。 ``` echo "ac_cv_func_malloc_0_nonnull=yes" > arm-linux.cache ``` 3. **配置 tslib** 使用 `--host=arm-linux` 指定目标平台,...

Global site tag (gtag.js) - Google Analytics