交叉編譯dbus模塊到Qt 遇到的錯誤及解決

轉自: 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,裏面內容如下:

  1. <SPAN style="FONT-SIZE: 18px">prefix=/usr/local/arm/dbus-1.0.2  
  2. exec_prefix=${prefix}  
  3. libdir=${exec_prefix}/lib  
  4. includedir=${prefix}/include  
  5. system_bus_default_address=unix:path=/usr/local/arm/dbus-1.0.2/var/run/dbus/system_bus_socket  
  6. sysconfdir=/usr/local/arm/dbus-1.0.2/etc  
  7. session_bus_services_dir=/usr/local/arm/dbus-1.0.2/share/dbus-1/services  
  8.   
  9. Name: dbus  
  10. Description: Free desktop message bus  
  11. Version: 1.0.2  
  12. <U><SPAN style="COLOR: #ff0000">Libs: -L${libdir} -ldbus-1    
  13. 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腳本中設置好 
# 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位置作修改)

發佈了18 篇原創文章 · 獲贊 10 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章