記一次耗時半天才解決的bug,我的圖標(biāo)到底去哪了?
昨天我遇到了一個很奇怪的bug,事情經(jīng)過是這樣的,我用Qt編寫了一個動態(tài)庫,這里稱之為lib,lib中有多個界面,相應(yīng)的我也在這些界面中加了一些圖標(biāo)。首先,我是在Windows下使用Qt MSVC編譯器編譯的,libA編譯完成以后,我通過另一個程序(這里稱之為app)來調(diào)用它,在app中通過調(diào)用lib的接口來顯示lib中的界面,此時一切正常,界面、圖標(biāo)、功能都和預(yù)期的一樣。
然后我將上述兩個工程拷貝到Linux系統(tǒng)下,使用Qt gcc進(jìn)行編譯,編譯也沒問題,運(yùn)行起來界面、功能也一切正常,但是所有的圖標(biāo)都不顯示。
此時,我并不覺得是什么大問題,感覺馬上就能解決掉,于是我先檢查了一下資源是否拷貝完整,然后執(zhí)行qmake,再重新構(gòu)建。運(yùn)行一下,問題還在。
還是不慌,此時我想明確一下問題是出在動態(tài)庫lib上還是應(yīng)用程序app上,于是我就用Qt新建了一個界面程序,添加庫lib,包含頭文件,然后接口調(diào)用,編譯運(yùn)行后,圖標(biāo)都顯示正常,沒有出現(xiàn)任何問題。于是就確定了問題出在了app上。
然后我就去檢查了一下依賴庫,是不是缺少imageformats文件夾,沒發(fā)現(xiàn)問題。于是就開始檢查代碼。因?yàn)槲以赼pp中使用了qss進(jìn)行樣式的設(shè)置,以我以前的經(jīng)驗(yàn)來看,可能是樣式表再作怪,如是我注釋了樣式表設(shè)置代碼,編譯運(yùn)行后,問題還在。
代碼查來查去,沒發(fā)現(xiàn)什么問題,于是開始重新梳理思路。圖標(biāo)不顯示,要么是資源問題,要么是依賴的問題,通過上面的檢查過程可以確定依賴沒問題,只能是資源出了問題。我的所有資源都添加在images.qrc中,我將images.qrc中的所有圖片資源全部刪除,然后重新添加,再次編譯后,問題還是沒解決。
奇了個大怪,怎么會這樣,不信邪的我,又打開了上面剛創(chuàng)建的測試動態(tài)庫是否正常的工程,添加Qt資源文件,按照習(xí)慣命名為images,然后往里面添加相同的圖片,然后編譯運(yùn)行,動態(tài)庫中的界面談了出來,但是圖標(biāo)不見了。問題就出現(xiàn)在這個images.qrc中,離真相已經(jīng)很近了,心情還有點(diǎn)小激動呢。
那么images.qrc有什么問題呢,首先圖片肯定不會對程序造成影響,那么就是images.qrc本身的原因,再看一下lib下的資源文件也叫images.qrc,難道是重名的原因,將app中的images.qrc改為app_images.qrc,重新編譯運(yùn)行,圖標(biāo)出現(xiàn),問題解決。
至于具體原因,網(wǎng)上也沒查到確切的說法,但是因?yàn)橹挥蠰inux下有問題,且又是重名時出現(xiàn),那多少時鏈接出現(xiàn)了錯誤,具體原因待我查到以后,放在評論中。