動態、靜態編譯以及MD、MDd、MT、MTd編譯


本文轉自:https://blog.csdn.net/u012273127/article/details/71419499

一、問題的引出

最近在VS2012中新建了一個MFC的工程,在自己電腦上運行很好,但是當拷貝到同學電腦上的時候一直出現“差dll”或者是“應用程序無法啟動”的錯誤。后來找出原因,是自己編譯的時候選擇靜態還是動態編譯的問題。
解決辦法1:讓同學安裝了VS2012,注意這里必須是和自己編譯器相同的版本,比如是2013就不行。
解決辦法2:在自己這邊用靜態編譯,重新生成可執行文件即可。

二、動態和靜態編譯的區別

1、區別:動態編譯的生成的可執行文件的exe小,但是運行需要系統環境具有相關的dll文件,就是動態調用系統相關的文件才能運行;靜態編譯生成的可執行文件exe大,但是運行的時候不依賴於系統環境所依賴的dll和lib等環境問題,在編譯的時候已經這些dll相關文件編譯進了exe文件,所以exe文件較大,但是執行的時候不會依賴於系統環境。所以需要自己創建的工程需要在別的電腦上運行,考慮到穩定性,同時對執行文件的大小沒有要求的話還是盡量選擇靜態編譯。
2、VS中兩種編譯狀態的設置:在工程的“屬性”中進行修改。具體截圖如下:
這里寫圖片描述
共享dll – 動態編譯;靜態庫中使用 – 靜態編譯。

三、MD、MDd、MT、MTd編譯

1、設置:在設置動態和靜態編譯后就需要對“C/C++ –> 代碼生成 –> 運行庫”進行設置,具體截圖如下:

這里寫圖片描述
2、編譯形式和四種運行庫的配置關系如下:
(1)、靜態編譯: debug狀態下 – MTd; release狀態下 – MT
(2)、動態編譯: debug狀態下 – MDd;release狀態下 – MD
記住:靜態編譯為T,動態編譯為D,debug下有個字母d,release下沒有字母d

四、測試

在VS2012中新建一個MFC對話框工程,分別配置和設置。
1、動態編譯debug下: exe大小為185KB
2、動態編譯release下: exe大小為88.5KB(release版本下少了很多中間文件所以比debug下的小)
3、靜態編譯debug下: exe大小為8.81MB
4、靜態編譯release下: exe大小為3.37MB(release版本下少了很多中間文件所以比debug下的小)
可以明顯注意到靜態編譯的生成的exe文件比動態生成的exe文件要大很多,因為編譯的時候將相應的dll也編譯進去exe之中,所以exe的大小會很大。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM