VS2013編譯的用c++寫的win32程序兼容性問題

最近在用VS2013寫程序,把編譯好的exe在別人的電腦上運行就會出現缺少msvcp文件不能運行的情況。在網上搜了一下,問題原因如下:

C/C++程序運行時需要標準庫的支持,Windows下爲msvcrt.dll(C運行時)和msvcp(C++運行時),Linux下爲libc.so和libstdc++.so。Windows XP裏面自帶VC 6.0的運行時,如果用VC 6編譯的話可以正常運行。

VS 2013的運行時必須額外安裝,也就是vc2013 redistribution。也可以像你現在做的這樣,編譯時選擇/MT,這時運行時將直接包含在你的執行文件中,就可以在任意機器上運行。這也是爲什麼你的文件變得非常大,因爲標準庫的實現被包括進去了。

解決辦法:

1、在生成解決方案時選擇release,而不是debug。

2、編譯時選擇/MT,這時運行時將直接包含在你的執行文件中,就可以在任意機器上運行。

具體操作:

一、MD(d)、MT(d)編譯選項的區別

1、編譯選項的位置

以VS2005爲例,這樣子打開:

1)         打開項目的Property Pages對話框

2)         點擊左側C/C++節

3)         點擊Code Generation節

4)         右側第六行Runtime Library項目

2、各個設置選項代表的含義

編譯選項

包含

靜態鏈接的lib

說明

/MD

_MT、_DLL

MSVCRT.lib

多線程、Release、DLL版本的運行時庫

/MDd

_DEBUG、_MT、_DLL

MSVCRTD.lib

多線程、Debug、DLL版本的運行時庫

/MT

_MT

LIBCMT.lib

多線程、Release版本的運行時庫

/MTd

_DEBUG、_MT

LIBCMTD.lib

多線程、Debug版本的運行時庫

 

簡單的說:

(1)/MD,表示運行時庫由操作系統提供一個DLL,程序裏不集成。

(2)/MT,表示運行時庫由程序集成。

 

二、/MD、/MT的選擇

      1、爲什麼選擇/MD,不選/MT?

         (1)程序就不需要靜態鏈接運行時庫,可以減小軟件的大小;

         (2)所有的模塊都採用/MD,使用的是同一個堆,不存在A堆申請,B堆釋放的問題。

      2、爲什麼選擇/MT,不選擇/MD?

         (1)有些系統可能沒有程序所需要版本的運行時庫,程序必須把運行時庫靜態鏈接上。

      3、多個模塊,必須選擇相同的運行時庫。

三、選擇/MT需要解決的堆空間釋放問題

         不同的模塊各自有一份C運行時庫代碼、或者根本沒有C運行時庫,導致了各個模塊會有各自的堆。如果在A堆中申請空間,到B堆中釋放就會有崩潰,在模塊A申請的空間,必須在模塊A中釋放。

         附件(下載地址:http://files.cnblogs.com/cswuyg/Test_MD_and_MT.rar)的DLL以及DLLUser代碼,以STL的string爲例,通過修改編譯選項驗證了這個問題。(string在賦值的時候需要釋放掉原來的空間,然後再申請新的空間存儲新的內容。)

 

四、參考資料

1、微軟關於MT、MD等的詳細介紹

http://msdn.microsoft.com/en-us/library/2kzt1wy3(v=VS.71).aspx

2、不要出現A模塊申請,B模塊釋放的情況

http://www.cnblogs.com/minggoddess/archive/2010/12/15/1907179.html

3、運行時庫有哪些版本

http://www.cppblog.com/MichaelLiu/articles/10607.html

4、CSDN上關於堆空間釋放的討論

http://topic.csdn.net/t/20010112/09/57983.html

http://topic.csdn.net/t/20031009/17/2338051.html

http://topic.csdn.net/u/20090502/00/bf1602e3-ddf5-49b0-af81-8a23383f9ddc.html

http://blog.csdn.net/blz_wowar/article/details/2176536

5、不同模塊不同的堆

http://www.cnblogs.com/WengYB/archive/2011/08/18/2144727.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章