以前很少調用MinGW的運行時庫,現在用到一個項目,用到了glib和gettext等。
遇到了一個問題,折騰了一個下午。
gettext的運行時庫之一是intl,MinGW只提供了.dll.a,於是參考了網上其它的介紹,像其它.lib一樣調用
pragma comment(lib, "libintl.dll.a")
結果就出現了
無法定位程序輸入點 GdiplusStartup於動態鏈接庫libintl-8.dll上。
我堅信libintl沒有用到GDI+,Depends查看dll后證明了我的觀點,但是Depends查看引用它的exe,卻發現exe認為GdiplusStartup在libintl.dll上。
只能證明一個問題,.dll.a和.lib不一樣。
那么需要找到相應的.lib,網上有自己編glib的辦法,看了看,環境搭建也比較復雜。后來想到一個問題,lib不過是dll導出庫的一個說明,那么一定有辦法通過dll生成lib。網上搜了后的確如此,意識到自己真的很土。
按網上說的下載pexports生成.def,然后lib命令生成dll后再導入,一切正常。
總結一下遇到的問題
- .dll.a,.a和.lib不一樣,像libx264.a等vs可以直接導入,我遇到的這個就不可以直接導入(實際上,我的DEBUG可以正常生成和運行,RELEASE生成是沒問題的,只是運行時出現上述問題,說明鏈接生成時是錯誤的,)。
- gettext有很多版本,網上下載一個msvc的版本可以直接用,但是要在安裝機器上部署多個不同版本的.dll,會使安裝包沒必要的增大。
- dll是可以生成.lib的,以后.a還是別用了,如果官方沒提供,就自己生成一個吧(.h文件沒辦法生成)。