1、linker input file unused because linking not done
這是今天做工程時遇到的一個警告。
我編譯了一個靜態庫libjason.a,然後把這個靜態庫文件和它的頭文件jason.h加入到工程目錄中。然後,把工程的Makefile文件刪除,重新打開QTCreator,在它自動成的Makefile文件的LIBS裏面加入libjason.a靜態庫(形如: -L ./ -ljason),然後編譯,便出現上文提示的信息。
這個問題的原因是由兩個方面造成的(根據工程的具體環境),首先要搞清楚預處理,編譯,鏈接的作用和之間的關係,再一個就是QTCreator生產Makefile的時候,默認直接把libjason.a加入到了INCPATH路徑裏邊,這樣就造成了沒有連接就直接使用,導致最終的警告。
解決過程:把INCPATH裏的libjason.a刪除即可編譯成功。
參考文獻:
同上問題的另一篇討論 http://gcc.gnu.org/ml/gcc-help/1999-12n/msg00351.html
解析QT靜態庫和動態庫 http://mobile.51cto.com/symbian-267846.htm
編譯與連接的知識 http://blog.chinaunix.net/uid-25808509-id-2743842.html
2、在linux中使用動態共享庫,分別爲a.so和b.so兩個庫,其中b.so由a.so調用,a.so由主工程調用。編譯都通過,但運行程序時出現如下錯誤提示:
……symbol lookup error:…….so.1: undefined symbol: _ZN11.....QString
類如下圖所示:
初始還以爲是我的動態庫編寫有問題,但仔細查看了幾遍,沒有什麼問題呀,編譯也都通過,先編譯成功b.so動態庫,然後在由a動態庫工程調用b.so文件,最終生成的a.so動態庫文件。爲了省去庫文件路徑配置的麻煩,我直接放到了/usr/lib裏邊。但出現問題是,也重新審視了LD_LIBRARY_PATH。但都沒問題呀。網上都翻遍了,出現類似問題的很多,但都沒能解決我的問題。
再仔細看看問題,最後的那一串 _ZN11VideoDeviceC1E7QString 提示很重要,肯定問題出現在相關VideoDevice(即上面的b.so)的文件裏邊。仔細查看了a動態庫工程的Makefile文件,再查看了主工程的Makefile文件,最終發現問題,也解決了問題。問題表現如下(仔細對比兩個文件的差異)
a的Makefile文件:
主工程文件Makefile的寫法:
這兩種寫法不一樣,導致在主工程文件生成的可執行文件運行時無法鏈接到具體的動態庫文件。
所以編程習慣和編程規範相當重要,一不留神那就是浪費生命了。
解決問題:把a動態庫工程中的Makefile文件裏的“ libvideodevice” 修改爲 “ -lvideodevice” 即可,然後重新編譯生成a.so動態庫文件,再放到主工程離去。
參考文獻:http://bbs.chinaunix.net/thread-1616529-1-1.html
3、編譯錯誤:undefined reference to `vtable for
原因一,只聲明而沒有定義析構函數;
原因二,由於在該類中使用了Q_OBJECT宏的緣故;
參考文獻一:http://1108038.blog.51cto.com/1098038/409968
參考文獻二:http://blog.csdn.net/yili_xie/article/details/4803482