日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于qte illegal instruction的一些心得

發布時間:2025/4/16 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于qte illegal instruction的一些心得 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近半個月在按照天嵌的TQ2440做qte方面的移植工作,去年剛拿到板子的時候用的是qt4.5的源碼,那時還能順利的移植到arm板上,可是最近也是按照天嵌手冊來移植,當我編譯一個qt測試程序,在arm板上一直提示:illegal instruction的錯誤;一下回顧記錄一下這幾天所收集到的一些資料

????? 主機:ubuntu11.04

????? 交叉編譯器:arm-linux-gcc-4.3

????? 開發板:TQ2440,arm9 ,armv4t

? 一 > 我們的程序為什么會收到IllegaI Instruction的錯誤呢:

? 參考:http://blog.chinaunix.net/space.php?uid=22767658&do=blog&id=1749758

?????? 程序出現illegal instruction的原因是因為我們的進程在運行的過程中收到了SIGILL信號,而這個信號是由cpu在發現一個非法指令之后發出一個異常,然后有負責處理該異常的ISR(中斷服務程序)對包含有這個非法指令的進程發出的,我們的進程在收到這個信號之后,一般就會報告一個illegal instruction的錯誤信息。

??????? 可執行程序含有非法指令的原因,一般就是cpu的架構不對,編譯時制定的march和實際執行的機器的march不符。在這種情況下,因為工具鏈一樣,鏈接腳本一樣,所以可執行程序可以執行,不會發生程序格式錯誤。但是會包含一些不兼容的指令。另外就是有可能程序的執行權限不夠所造成的。

二 >?既然有可能是march不匹配的問題,就要想辦法進行嘗試啊,怎么才能修改編譯時制定程序的march是arm呢,對了,我們的arm9用armv4t,內核是arm920t,可是需要修改哪個文件呢,在網絡上找到這樣一篇文章:http://wiki.linuxmce.org/index.php/Mini2440_Orbiter_setup_and_FAQ#What_compiler_switches_do_I_need_to_build_working_code_on_a_mini2440.3F

What compiler switches do I need to build working code on a mini2440?

If you're staring at "illegal instruction error" problems, and using arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2008q3-72) 4.3.2, you need this:

? ??-msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t

看來在我們編譯qt程序時,需要顯示的指定這些參數,但是,問題還是沒解決啊,在哪個文件中添加這些選項呢? 請看三

三 > 在講到需要修改的文件之前,我先插入一點自己的理解,無論是我們使用天嵌自帶的qt4.5的源碼,還是從網絡上下載最新的qt4.7.4(目前是最新的),我們所要做的就那么三步:1)./configure 2) make 3) make install;可是在1)中是比較令人頭疼的,因為如果你直接./configure的話,編譯的是針對X86的X11的qt庫,所以你需要在./configure 後添加-embedded arm的選項,還需要制定交叉編譯器,所以就需要在qt源碼包下使用:./configure -embedded -help來查看該源碼包支持那些配置選項,了解這些選項之后,就可以編譯生成最適合自己的qt庫了,我沒搞明白自己需要哪些庫,所以我就按照天嵌科技的配置選項來配置,然后make;make install,最好指定一下自己生成庫的路徑,即配置-prefix的選項;

????? 好,當明白了怎么編譯源碼庫之后,就開始干活,包括./configure;make;make install;將生成的庫copy到自己的開發板下;設置庫路徑;交叉編譯一個最簡單的hello world的qt程序,然后將可執行文件復制到開發板的/bin目錄下,運行還是會提示:illegal instruction

四> 當我們明白是怎樣編譯qt庫,并將庫復制到文件系統中,運行測試程序出現 :illegal instruction錯誤時,我們可以參考一下這幾篇文章:

http://stackoverflow.com/questions/5621393/illegal-instruction-when-cross-compiling-qt-4-7

http://www.kuche361.com/ht/view/id-39165

http://pastebin.com/D3RECiUj

其中http://www.kuche361.com/ht/view/id-39165這篇文章說的比較具體一點,在./configure之前,按照該文章進行配置,結果是能夠正常運行的;我有部分沒有按照他的做,那就是修改/mkspecs/common/g++.conf文件的QMAKE_CFLAGS_RELEASE += -O2 為QMAKE_CFLAGS_RELEASE += -O0,即對自己的程序不進行優化,我沒有修改,結果還是能正常運行,qt啊,真是讓人琢磨不透啊;不過,既然不提示非法指令,已經向前前進一大步了;

??? 我用同樣的方法,制作了一個qt4.7.4版本的qte庫,并用該庫制作了一個簡單的qt程序,在控制端該程序也不提示錯誤,沒有任何征兆,在arm板上就是不能彈出界面,令人好生糾結啊;不過既然4.5的能夠工作了,先做著,項目還是要向前走的;qt4.7.4的問題,既然已經有思路了,就慢慢的來搞吧。


附錄:

我制定-prefix為/opt/EmbedSky/qt-4.5/__install/arm/

/opt/EmbedSky/qt-4.5/qt-embedded-linux-opensource-src-4.5.0/mkspecs/qws/linux-arm-g++下的qmake.conf的文件如下

#
# qmake configuration for building with arm-linux-g++
#

include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)

# modifications to g++.conf
QMAKE_CC??????????????? = arm-none-linux-gnueabi-gcc
QMAKE_CXX?????????????? = arm-none-linux-gnueabi-g++
QMAKE_LINK????????????? = arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB??????? = arm-none-linux-gnueabi-g++

# modifications to linux.conf
QMAKE_AR??????????????? = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY?????????? = arm-none-linux-gnueabi-objcopy
QMAKE_STRIP???????????? = arm-none-linux-gnueabi-strip

QMAKE_CFLAGS? ??? ??? ?+= -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
QMAKE_CXXFLAGS ?? ??? ?+= -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t

load(qt_config)

?安裝目錄下的qmake.conf修改如下:因為不顯示修改的話,可能會導致在配置PC的qmake路徑時,提示找不到arm-none-linux-gnueabi-g++命令;如果沒有提示,這個不用修改也可以

/opt/EmbedSky/qt-4.5/__install/arm/mkspecs/qws/linux-arm-g++

?

#
# qmake configuration for building with arm-linux-g++
#

include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)

# modifications to g++.conf
QMAKE_CC??????????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-gcc
QMAKE_CXX?????????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK????????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB??????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-g++

# modifications to linux.conf
QMAKE_AR??????????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY?????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-objcopy
QMAKE_STRIP???????????? = /opt/EmbedSky/4.3.3/bin/arm-none-linux-gnueabi-strip

QMAKE_CFLAGS? ??? ??? ?+= -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
QMAKE_CXXFLAGS ?? ??? ?+= -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t

load(qt_config)

?

最后,對自己的程序不進行優化的話,可以修改/opt/EmbedSky/qt-4.5/__install/arm/mkspecs/common下的g++.conf中的QMAKE_CFLAGS_RELEASE?? ?+= -O2 為-O0;

總結

以上是生活随笔為你收集整理的关于qte illegal instruction的一些心得的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。