解決VS2012/VS2013/VS2015下編譯的程序無法在XP下運行的問題

微軟爲了推銷自家平臺,默認配置下VS2012和VS2013編寫的應用程序只能在Vista/Win7/Win8上運行。但幸好還保留了生成XP程序的設置項。XP和Win2003的用戶還是大量存在的,我們程序軟件的發佈不能不考慮他們。 
  1. 項目菜單->項目屬性->配置屬性->常規->平臺工具集,選擇“VS2013WindowsXP(v120_xp)”; 
  2. 項目菜單->項目屬性->配置屬性->常規->MFC的使用,選擇在靜態庫中使用MFC; 
  3. 項目菜單->項目屬性->鏈接器->系統->子系統->控制檯或窗口windows(根據你的項目類型選擇),第二項版本號設成5.01。 
  4. C/C++->代碼生成->運行庫,選擇“多線程調試(/MTd)”; 
  5. 還需要至少帶有Update3(或4),這一點我沒有驗證,因爲我直接安裝的就是帶有Update3的VS2013。 
  以上就OK了。缺點仍然有,例如靜態編譯的EXE比正常動態要大不少,目前我尚未試出動態編譯後在XP中能運行的方法,–不過這個不要緊,因爲VS2013版本如此之高,客戶的電腦上很難自帶配有它的運行庫,你即使動態編譯,發佈軟件時也還是要帶上運行庫的,只不過在多個程序時只需帶一份運行庫罷了。 
  另外,我在實際大項目中用上述方法,仍有出錯現象發生。以後再研究吧。一般情況下上述方法就可以了。 
  在網上另外發現了這個貼子,說得很詳細,包括非IDE的命令行編譯,一起貼到下面: 
  問題一:編譯出來的exe在xp上面運行提示“不是有效的win32應用程序”

  在vs2012/2013版本里面,其自帶的c編譯器cl.exe,若直接使用cl a.c編譯,那麼生成出來的exe放在vista及以上版本直接運行沒有問題,但是在xp上則會出來“不是有效的win32應用程序”的出錯提示。這是因爲vs2012/2013自帶的c編譯器默認情況下生成的exe會默認只支持vista及以上版本的windows系統。

  解決方法:

  對於使用命令行cl.exe直接編譯的方式: 
先用cl a.c編譯一遍,此時會生成a.exe和a.obj兩個文件,此時,再執行 link b.obj /subsystem:console,5.01,它會鏈接一個新的a.exe出來,此時的exe就可以在xp上運行了。相比vs2010以及以前版本的編譯器編譯,會多第二步的link過程,後面的參數也很容易理解,subsystem,5.01,此處的5.01是指的windows內核版本號,5.01表示windows 2000 with sp1,即此exe可以在win2000 sp1及以上的windows中執行。

  當然,這個地方的/subsystem後面有很多參數,上面給的console,5.01是指命令行程序,如果是有GUI即有窗口的程序,改成windows,5.01即可。!!注意!!此處的5.01一定不要想當然改成5.0就變成windows 2000 不帶sp1的版本,實際上,5.0並不被vs2013的編譯所承認,會報警告不認5.0,就會按照默認的不帶5.01的方式編譯,這樣就無法在vista以下的系統中運行生成的exe了。

  對於在vs2013裏面使用新建項目的方式: 
右擊相應的項目,選擇“屬性”,在項目屬性頁中的“配置屬性”下面的“常規”裏面,把“平臺工具集”,由“Visual Studio 2013 (v120)”改成“Visual Studio 2013 - Windows XP (v120_xp)”,確定之後,重新生成項目即可。當然這裏按這樣修改的話,就只能在winxp及以上的版本系統裏面運行了。

  問題二:用vs2010/2012/2013編譯出來的exe在未安裝vc++運行庫的機器上運行時提示”未找到MSVCR120D.DLL“從而無法運行

  這是個老問題了,無非就是運行庫動態編譯和靜態編譯的問題了。dll動態加載的話有個好處,它可以減少生成的exe文件的體積,但是缺點就是如果對應的系統環境變量或者exe所在的目錄裏面找不到其所需要的dll文件的話,程序就會拒絕執行。而靜態編譯就是把所有需要的庫都靜態編譯到exe文件裏面,這樣就可以在所有的系統平臺上都能運行,但它也有一個缺點,就是生成的exe文件因爲已經帶了部分庫的代碼,所以體積會相對動態編譯出來的exe大(具體大多少要根據庫的內容才能確定)。

  解決方法:

  對於直接使用cl.exe和link.exe編譯連接的方式: 
直接在cl.exe編譯的時候或者在makefile裏面把編譯參數加上/MT即可。

  對於在vs2013裏面使用新建項目的方式: 
右擊相應的項目,選擇“屬性”,在項目屬性頁中的“配置屬性”下面的“C/C++”下面的“代碼生成”一項,由默認的“多線程調試DLL (/MDd)”,改成“多線程 (/MT)”,確定之後,重新生成項目即可。這樣所得的exe文件就是靜態編譯了。

轉自:http://blog.csdn.net/asanscape/article/details/38752655

發佈了11 篇原創文章 · 獲贊 16 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章