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

讓用VS2012/VS2013編寫的程序在XP中順利執行

體積 rgb -- 方法 拒絕 style upd con 代碼生成

  微軟為了推銷自家平臺,默認配置下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過程。後面的參數也非常easy理解。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文件就是靜態編譯了。


讓用VS2012/VS2013編寫的程序在XP中順利執行