1. 程式人生 > >讓用VS2012/VS2013編寫的程式在XP中順利執行

讓用VS2012/VS2013編寫的程式在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檔案就是靜態編譯了。