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

来源:互联网 发布:肺活量测量仪器软件 编辑:程序博客网 时间:2024/06/07 09:33

转自: http://blog.csdn.net/yanzi1225627/article/details/7855124

由于用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. */
};
注意上面最后的“;”要带的。

如果出现以下内容:
checking for LIBXML2… configure: error: Package requirements (libxml-2.0 >= 2.6) were not met:
No package ‘libxml-2.0’ found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables LIBXML2_CFLAGS
and LIBXML2_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
其实已经安装上 libxml2 了的,这里只是一个环境变量没有设置好而已。
解决办法:
(1)确定 /usr/local/libxml2/lib/pkgconfig 目录下有 libxml-2.0.pc
(2)export PKG_CONFIG_PATH=/usr/local/libxml2/lib/pkgconfig:$PKG_CONFIG_PATH
(3)再./configure一次,到没有出现错误就OK了。
Ubunto 下编译libxml2出错

gcc -DHAVE_CONFIG_H -I. -I. -I. -I./include -I./include -D_REENTRANT -g -O2 -pedantic -W -Wformat -Wunused -Wimplicit -Wreturn-type -Wswitch -Wcomment -Wtrigraphs -Wformat -Wchar-subscripts -Wuninitialized -Wparentheses -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wredundant-decls -MT nanohttp.lo -MD -MP -MF .deps/nanohttp.Tpo -c nanohttp.-fPIC -DPIC -o .libs/nanohttp.o nanohttp.c: In function 'xmlNanoHTTPFetch__internal_alias': nanohttp.c:1558: warning: ignoring return value of 'write', declared with attribute warn_unused_result nanohttp.c: In function 'xmlNanoHTTPSave__internal_alias': nanohttp.c:1597: warning: ignoring return value of 'write', declared with attribute warn_unused_result In function 'open',     inlined from 'xmlNanoHTTPSave__internal_alias' at nanohttp.c:1588: /usr/include/bits/fcntl2.h:51: error: call to '__open_missing_mode' declared with attribute error: open with O_CREAT in second argument needs 3 arguments make[1]: *** [nanohttp.lo] Error 1 make[1]: Leaving directory `/home/winetcn/libxml2-2.6.30' make: *** [install-recursive] Error 1
 
 

解决方法:

打开目录下的nanohttp.c,第1588行由

fd = open(filename, O_CREAT | O_WRONLY);更换为fd = open(filename, O_CREAT | O_WRONLY,0777);

 

之后make ,make install一路顺利!

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



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

[html] view plaincopyprint?
  1. <SPAN style=”FONT-SIZE: 18px”>prefix=/usr/local/arm/dbus-1.0.2  
  2. exec_prefix={prefix}&nbsp;&nbsp;</span></li><li class="alt"><span></span><span class="attribute"><span style="color:#ff0000">libdir</span></span><span>={exec_prefix}/lib  
  3. includedir={prefix}/include&nbsp;&nbsp;</span></li><li class="alt"><span></span><span class="attribute"><span style="color:#ff0000">system_bus_default_address</span></span><span>=</span><span class="attribute-value"><span style="color:#0000ff">unix</span></span><span class="attribute"><span style="color:#ff0000">:path</span></span><span>=/usr/local/arm/dbus-1.0.2/var/run/dbus/system_bus_socket&nbsp;&nbsp;</span></li><li><span></span><span class="attribute"><span style="color:#ff0000">sysconfdir</span></span><span>=/usr/local/arm/dbus-1.0.2/etc&nbsp;&nbsp;</span></li><li class="alt"><span></span><span class="attribute"><span style="color:#ff0000">session_bus_services_dir</span></span><span>=/usr/local/arm/dbus-1.0.2/share/dbus-1/services&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li class="alt"><span>Name:&nbsp;dbus&nbsp;&nbsp;</span></li><li><span>Description:&nbsp;Free&nbsp;desktop&nbsp;message&nbsp;bus&nbsp;&nbsp;</span></li><li class="alt"><span>Version:&nbsp;1.0.2&nbsp;&nbsp;</span></li><li><span></span><strong><span style="color:#993300"><span class="tag">&lt;</span><span class="tag-name">U</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">SPAN</span></span></strong><span>&nbsp;</span><span class="attribute"><span style="color:#ff0000">style</span></span><span>=</span><span class="attribute-value"><span style="color:#0000ff">"COLOR:&nbsp;#ff0000"</span></span><span class="tag"><strong><span style="color:#993300">&gt;</span></strong></span><span>Libs:&nbsp;-L{libdir} -ldbus-1    
  4. Cflags: -I{includedir}/dbus-1.0&nbsp;-I{libdir}/dbus-1.0/include</SPAN></U></SPAN>  
[html] view plain copy
print?
  1. <span style=“font-size:18px;”>prefix=/usr/local/arm/dbus-1.0.2  
  2. exec_prefix={prefix}&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="attribute">libdir</span><span>={exec_prefix}/lib  
  3. includedir={prefix}/include&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="attribute">system_bus_default_address</span><span>=</span><span class="attribute-value">unix</span><span class="attribute">:path</span><span>=/usr/local/arm/dbus-1.0.2/var/run/dbus/system_bus_socket&nbsp;&nbsp;</span></span></li><li class=""><span><span class="attribute">sysconfdir</span><span>=/usr/local/arm/dbus-1.0.2/etc&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="attribute">session_bus_services_dir</span><span>=/usr/local/arm/dbus-1.0.2/share/dbus-1/services&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>Name:&nbsp;dbus&nbsp;&nbsp;</span></li><li class=""><span>Description:&nbsp;Free&nbsp;desktop&nbsp;message&nbsp;bus&nbsp;&nbsp;</span></li><li class="alt"><span>Version:&nbsp;1.0.2&nbsp;&nbsp;</span></li><li class=""><span><span class="tag">&lt;</span><span class="tag-name">u</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">"color:#ff0000;"</span><span class="tag">&gt;</span><span>Libs:&nbsp;-L{libdir} -ldbus-1    
  4. Cflags: -I{includedir}/dbus-1.0&nbsp;-I{libdir}/dbus-1.0/include</span></u></span>  
prefix=/usr/local/arm/dbus-1.0.2exec_prefix=${prefix}libdir=${exec_prefix}/libincludedir=${prefix}/includesystem_bus_default_address=unix:path=/usr/local/arm/dbus-1.0.2/var/run/dbus/system_bus_socketsysconfdir=/usr/local/arm/dbus-1.0.2/etcsession_bus_services_dir=/usr/local/arm/dbus-1.0.2/share/dbus-1/servicesName: dbusDescription: Free desktop message busVersion: 1.0.2Libs: -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的configure

在 configure脚本中设置好 

# flags for libdbus-1
QT_CFLAGS_DBUS=”-I/opt/expat201Arm/lib/dbus-1.0/include -I/opt/expat201Arm/include/dbus-1.0”
QT_LIBS_DBUS=”-L/opt/expat201Arm/lib -ldbus-1 -lpthread -lrt “
(这是我的路径,各位具体路径根据自己编译的 DBUS位置作修改)

阅读全文
0 0
原创粉丝点击