跨編譯器的動態庫
今天想用Qt去調用靜態庫,碰巧這個庫又是用Vs生成的,於是乎...
使用Qt生成一個靜態庫,並使用Qt程序去調用,程序正常編譯運行。但使用VS生成靜態庫,再使用Qt程序去調用,程序不能編譯,錯誤File format not recognized (無法識別文件格式)
。然而使用Vs生成動態庫,再使用Qt去調用,程序就能夠正確編譯和運行。其中Qt默認使用MinGw編譯器。
那么是怎么回事呢?
靜態庫是編譯未鏈接的產物,當編譯可執行程序時會去鏈接靜態庫中的函數,由於使用了不同的編譯器編譯,因此會導致文件格式無法識別。
而動態庫是已被編譯和鏈接的資源,相比exe它只是沒有入口main,即已經是一個能被機器解讀的文件內容。在exe編譯過程中只是去查找了外部聲明,並沒要把動態庫的內容再次編譯進去,因此能夠編譯通過。在exe運行時會把庫內容拷貝到程序中,盡管動態庫和可執行文件是兩個不同的編譯器,但是它們最終都是被翻譯成了機器語言,因此程序可以調用庫中函數運行。
使用動態庫
在.pro文件中添加以下語句,指定動態庫的導入庫, 並在程序運行時把動態庫拷貝到程序所在路徑。
LIBS += $$PWD/lib/myfun.lib
使用靜態庫
在.pro文件中直接指定靜態庫
LIBS += $$PWD/lib/libmyfun.a