转自: 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.c -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,里面内容如下:
- <SPAN style=”FONT-SIZE: 18px”>prefix=/usr/local/arm/dbus-1.0.2
- exec_prefix={prefix} </span></li><li class="alt"><span></span><span class="attribute"><span style="color:#ff0000">libdir</span></span><span>={exec_prefix}/lib
- includedir={prefix}/include </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 </span></li><li><span></span><span class="attribute"><span style="color:#ff0000">sysconfdir</span></span><span>=/usr/local/arm/dbus-1.0.2/etc </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 </span></li><li><span> </span></li><li class="alt"><span>Name: dbus </span></li><li><span>Description: Free desktop message bus </span></li><li class="alt"><span>Version: 1.0.2 </span></li><li><span></span><strong><span style="color:#993300"><span class="tag"><</span><span class="tag-name">U</span><span class="tag">></span><span class="tag"><</span><span class="tag-name">SPAN</span></span></strong><span> </span><span class="attribute"><span style="color:#ff0000">style</span></span><span>=</span><span class="attribute-value"><span style="color:#0000ff">"COLOR: #ff0000"</span></span><span class="tag"><strong><span style="color:#993300">></span></strong></span><span>Libs: -L{libdir} -ldbus-1
- Cflags: -I{includedir}/dbus-1.0 -I{libdir}/dbus-1.0/include</SPAN></U></SPAN>
- <span style=“font-size:18px;”>prefix=/usr/local/arm/dbus-1.0.2
- exec_prefix={prefix} </span></span></li><li class="alt"><span><span class="attribute">libdir</span><span>={exec_prefix}/lib
- includedir={prefix}/include </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 </span></span></li><li class=""><span><span class="attribute">sysconfdir</span><span>=/usr/local/arm/dbus-1.0.2/etc </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 </span></span></li><li class=""><span> </span></li><li class="alt"><span>Name: dbus </span></li><li class=""><span>Description: Free desktop message bus </span></li><li class="alt"><span>Version: 1.0.2 </span></li><li class=""><span><span class="tag"><</span><span class="tag-name">u</span><span class="tag">></span><span class="tag"><</span><span class="tag-name">span</span><span> </span><span class="attribute">style</span><span>=</span><span class="attribute-value">"color:#ff0000;"</span><span class="tag">></span><span>Libs: -L{libdir} -ldbus-1
- Cflags: -I{includedir}/dbus-1.0 -I{libdir}/dbus-1.0/include</span></u></span>
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的configure
在 configure脚本中设置好
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位置作修改)