1. 程式人生 > >VS:執行庫 MT、MTd、MD、MDd

VS:執行庫 MT、MTd、MD、MDd

1. 問題

VS中開發windows程式是經常需要將編譯OK的程式移到另一臺機器上執行的情況,有時會出現錯誤;

這一般是因為另一臺機器上面沒有安裝相應的執行庫導致的,

那麼執行庫的選項MT、MTd、MD、MDd分別代表什麼意義呢?

                               

2. 概念

這是msdn上面的解釋:

MT:mutithread,多執行緒庫,編譯器會從執行庫裡面選擇多執行緒靜態連線庫

來解釋程式中的程式碼,即連線LIBCMT.lib庫

MTd:mutithread+debug,多執行緒除錯版,連線LIBMITD.lib庫

MD:MT+DLL,多執行緒動態庫,連線MSVCRT.lib庫,這是個匯入庫,對應動態庫為MSVCRT.dll

MDd: MT+DLL+debug,多執行緒動態除錯庫,連線MSVCRTD.lib庫,對應動態庫為MSVCRTD.dll

開發多執行緒程式時,需要選擇MT、MTd、MD、MDd其中的一個。

3. 結論

(1)對於MT/MTd,由於連線執行時庫是LIBCMT.lib/LIBCMTD.lib,這兩個庫是靜態庫,所以此種方式編譯的程式,移到另一臺機器上面也可以正常執行。

(2)但是對於MD/MDd,連線的是動態庫,所以如果另一臺機器上沒有MSVCRT.dll/MSVCRTD.dll時,就提示缺少動態庫這樣的錯誤。

 

曾經犯這樣的錯誤,以為以MT/MTd方式編譯,程式對所有的庫都是靜態連結的,其實錯了,它只能決定執行時庫是動態連結還是靜態連結,對使用者自己寫的庫或其他第三方庫,其連線方式取決於程式碼(顯示連線動態庫Loadlibrary)或所提供的lib檔案(為匯入庫還是靜態庫),移動程式到別的機器上時,還是要帶上所需要的動態庫的。

【注】:一個程式中混合了不同的執行庫(靜態庫和動態庫,除錯庫和非除錯庫),可能會產生衝突,所以一個程式中應該使用相同的執行時庫。

參考文章:

1.  http://www.cnblogs.com/ShaneZhang/p/3480502.html