交叉编译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文件夹,打包压缩,拷贝到板子里再解压放到相应位置就可以了!如有疑问,参考我前几篇博客。


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
如果你要在 Linux 上使用 Qt 框架进行开发,可能需要安装 Qt 的 x11extras 模块。这个模块包含了一些额外的 X11 工具和函数,可以帮助你更方便地开发基于 Qt 的 X11 应用程序。但是,如果你想在另一台机器上运行你的应用程序,你需要进行交叉编译,以便将应用程序编译为目标机器的二进制文件。下面是一个简单的步骤: 1. 安装交叉编译工具链 要进行交叉编译,你需要先安装交叉编译工具链。这个工具链包含了编译器、链接器和其他必要的工具,可以将你的代码编译为目标机器上的二进制文件。你可以从交叉编译工具链提供商的网站上下载并安装它们。一些常见的交叉编译工具链提供商包括:CodeSourcery、Android NDK 和 Linaro。 2. 下载 Qt 源代码 你需要下载 Qt 源代码并解压它。你可以从 Qt 的官方网站上下载 Qt 源代码,或者从 Git 存储库克隆代码。在下载完源代码后,你需要解压它。 3. 配置 Qt 使用交叉编译工具链进行编译之前,你需要配置 Qt。在 Linux 上,你可以使用以下命令来配置 Qt: ``` ./configure -prefix /path/to/installation -xplatform linux-arm-gnueabi-g++ -embedded arm -little-endian -no-pch -no-qt3support -no-opengl -no-openvg -no-xcb -no-xkb -no-glib -no-cups -no-largefile -no-accessibility -no-openssl -no-gtkstyle -no-nis -no-iconv -no-freetype -no-fontconfig -no-sm -no-xinerama -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-mitshm -no-xinput -no-xvideo -no-xsync -no-xshm -no-mtdev -no-glib -no-icu -no-dbus -no-pulseaudio -no-alsa -no-sql-sqlite -no-sql-mysql -no-sql-odbc -no-sql-ibase -no-sql-psql -no-sql-sqlite2 -no-sql-tds -no-gif -no-jpeg -no-mng -no-png -no-tiff -no-xmlpatterns -no-multimedia -no-phonon -no-phonon-backend -no-svg -no-webkit -no-script -no-scripttools -no-declarative -no-declarative-debug -no-qtwebkit -no-javascript-jit -no-qml-debug -no-qml-debugger -no-exceptions -no-stl -no-rtti -no-reduce-relocations -no-gui -no-widgets -no-audio-backend -no-qttest -no-rpath ``` 这个命令将 Qt 配置为使用交叉编译工具链进行编译。你需要根据你的目标机器和交叉编译工具链进行修改。一些常见的配置选项包括: - `-prefix`:指定 Qt 安装路径。 - `-xplatform`:指定目标机器的平台。 - `-no-gui`:禁用 Qt GUI 模块,因为你只需要编译 x11extras 模块。 4. 编译 Qt 配置完成后,你可以使用以下命令进行 Qt 编译: ``` make ``` 这个命令将使用交叉编译工具链进行编译,并生成目标机器上的二进制文件。整个编译过程可能需要一些时间,取决于你的计算机性能和编译选项。 5. 安装 x11extras 模块 完成 Qt 编译后,你需要将 x11extras 模块安装到目标机器上。你可以使用以下命令将模块复制到目标机器上: ``` make install ``` 这个命令将把 Qt 安装到指定的安装路径。你需要在目标机器上运行这个命令,以便将 x11extras 模块复制到目标机器上。完成安装后,你就可以在目标机器上使用 Qt 的 x11extras 模块了。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值