標籤:system windowsxp svc 機器 運行時 軟體 表示 核心版本 串連
原文轉自 http://blog.csdn.net/asanscape/article/details/38752655
微軟為了推銷自家平台,預設配置下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檔案就是靜態編譯了。
【Visual Studio】讓用VS2012/VS2013編寫的程式在XP中順利運行(轉)