[转]如何使用VS 2013發布一個可以在Windows XP中獨立運行的可執行文件

https://read01.com/Mg337.html  (台/湾的论坛,需要f/q)

1、

閱讀此文章的同學先看看我的另外一篇文章:

現在,我們深入探討一下:

《如何使用VS 2013發布一個可以在Windows XP中獨立運行的可執行文件》。

這個問題是比較常見且容易造成初學者困惑的,作為曾經撞了無數次南牆的初級代碼狗終於看到了自己能夠回答的問題,那麼就讓我來簡單闡述一下造成這個問題的簡單原理極其簡單解決方法,如有錯誤紕漏敬請指正。

/*我們討論的是非託管的C++程序。*/

為了方便說明,我們新建一個簡單的控制台應用程式項目,直接如圖:

非常簡單,一個使用了C++標準庫的控制台應用程式,在裝有開發環境的本機順利執行出如下效果:

真是一個曠世奇作,我們迫不及待地就此發給XP老哥炫耀,萬萬沒想到:

裝逼不成反被XP老哥奚落:「負分滾粗!」

這裡我們遇到了題主遇到的問題之一,確實叫人納悶,不過隨便搜索一下就會有解決方法:

是的,在項目配置屬性中,將平台工具集選擇為"Visual Studio 2013 - Windows XP (v120_xp)",即可解決「無效的 Win32 應用程式」問題。

但是我們還要知其所以然,為什麼?

項目默認的Visual Studio 2013(v120) 與 Visual Studio 2013 - Windows XP(v120_xp) 生成出來的可執行文件有何區別,以至於前者在XP上執行會出現那樣的錯誤?

最直覺的方法自然是比較一下兩版執行文件的區別,我們選用PE (Portable Executable:32位或64位Windows作業系統使用的可執行程序或者動態連結庫的文件格式)工具 Stud_PE 進行PE文件頭結構比較,很容易看到區別:

看到打紅叉的地方,就是兩個文件不同之處,其他地方幾乎沒有區別。

關於PE文件結構是另外一個話題,我們暫不深入討論。

單就這兩處我們顧名思義一下就很容易明白:

MajorOSVersion ,(目標)作業系統主版本號 ,選擇默認平台工具集的文件的值是6,後者是5。

MinorOSVersion ,(目標)作業系統次版本號,前者是0,後者是1。

MajorSubsystemVersion,(目標)Win32子系統主版本號,前者是6,後者是5。

MinorSubsystemVersion,(目標)Win32子系統次版本號,前者是0,後者是1。

總結一下:一個是6.0 ,一個是5.1 。

很明顯5.1不就是XP的版本號麼,6.0就是Vista唄?

我們是否可以認為,項目默認選擇的「平台工具集」生成的可執行文件是不能在6.0以下版本的Windows運行的?

試驗結果是:當我把6.0手動修改成5.1之後,這個文件立刻可以正常在XP里運行了,事實上Major/MinorOSVersion的值似乎沒有起到什麼作用,僅僅修改XxxxxSubsystemVersion的值就可以保證程序順利執行起來了。反之亦然。同時還發現:在XP中,改為5.1可以,5.2及更高就不行。

對於這個問題的認識雖然仍流於表面,但由於知識有限,我們就不再深究PE結構中的這幾個值的深層次含義了。當然如有大牛指點一二就更好了。

現在好了!我們不但解決了XP的運行問題,還大致了解了問題的根源。那麼讓我們繼續發布吧!

將新的、XP的、「5.1的」版本發給XP老哥:

我勒個去?你等等,我再編譯一個release版本…… 試試:

擦?不是說好的「Release"嗎?你等等,不就是一個dll文件嗎,我這裡有!我發給你……

我從自己的系統(Win 8.1 x64)C:\Wdinwos\system32 文件夾找一個MSVCP120.DLL發過去:

是啊,這不是逗呢?拿64位的dll文件去冒充32位,能行? 重新去VS目錄里扒一個正確的32位msvcp120.dll 補上:

又來,這次叫做MSVCR120.dll ,不仔細看還真沒認出來。繼續補上:

呵呵呵呵呵,終於得以正確運行了,但是這麼狼狽的炫耀怎麼能讓人高興起來呢?

經過一番折騰,好歹知道了是因為缺少文件,那麼下次發布程序把這些瓶瓶罐罐DDLL都帶上打包不就行了嗎?沒錯,確實是這麼個道理,但總感覺很不專業的樣子。

所以一個正常的解決方案就是和其他答案中所說的那樣,讓目標機器安裝

VisualC++Redistributable Packages forVisualStudio2013 。

這個東西的作用就是:

安裝運行使用 VisualStudio2013 生成的 C++ 應用程式時所需的運行時組件。

簡單觀察安裝後系統中多出了哪些文件:

這樣一看,「運行時組件」就變得直觀和具體了。

它們都是什麼呢?我們先去VS的安裝目錄中看一下:

通過路徑很容易理解,這是有關VC的redist(再發行)的東西,我們進x86看一下:

有關CRT(運行時庫),MFC,MFCLOC(MFC的本地化文件)等等,我們看看CRT裡面:

看到了眼熟的這兩個dll了,實際上你參考前面那個XP多出文件的圖片,那些dll都能在這裡找到。

這就是 Visual C++ Redistributable 包括的東西,每個VS版本都不一樣。VS2013對應的就是120。

那管它是VS2013還是2012還是2008,對應的發行包給裝上不就完了。

沒錯。但是我們還要繼續研究一下,至少,研究一下如何讓一個可執行文件「獨立」運行在XP上。

回到項目配置,如下圖:

我們看到,運行庫這一項,包含4種選擇。

廢話不多說,我們簡單粗暴乾脆每一種都生成一個進行比較:

四種版本,分別起了對應的名稱,多線程(MT),多線程DLL(MD),多線程調試(MTd),多線程調試DLL(MDd)。

利用 Stud_PE 觀察比較它們的 函數導入表 ,發現:

1. 多線程DLL (MD)和 多線程調試DLL (MDd)

兩者都導入了2個MSVCxxxx.dll (黃箭頭所指),但細看又不同,調試版本(MDd)導入的是MSVCP120D.dll和MSVCR120D.dll,比非調試(MD)的那個都多一個字母D。很明顯這是配套給調試版的運行時庫。而我們之前安裝的發行包所部署的都是不帶D的版本,是給Release版的程序配套使用的。

順便一提MSVCP代表MicroSoft Visual C++(Plus) ,MSVCR則代表MicroSoft Visual C(沒有+)Runtime。 一個是C++運行時庫一個是C運行時庫。

2.多線程(MT) 與 多線程調試(MTd)貌似一樣,都沒有MSVCP和MSVCR函數導入,只有Kernel32.dll。同時觀察這兩個文件的體積,都比MD或MDd大了很多,這正是它們不需要導入運行時庫DLL函數的原因,因為它們把運行時庫靜態編譯到自己的文件中去了。這也代表著它們運行的時候不會再依賴外部的運行時庫DLL文件。

所以答案就在這裡,想要你的exe獨立運行在XP中:

1.將平台工具集選擇為"Visual Studio 2013 - Windows XP (v120_xp)"。

2.將運行庫選擇為 【多線程 /MT 】或【多線程調試 /MTd】。

3.當然如果使用了MFC,同理的要設置【在靜態庫中使用MFC】:

事情很簡單,大致就是這樣了。

2、

3、

时间: 2024-10-14 12:07:12

[转]如何使用VS 2013發布一個可以在Windows XP中獨立運行的可執行文件的相关文章

【转】如何使用VS 2013发布一个可以在Windows XP中独立运行的可执行文件

问题描述: 用VS2013写好一个程序,在本机上运行一切正常.但是如果直接把exe文件放到另一台机器上用,则会出现: Windows XP:不是一个正常的win32程序 Window 7:缺少msvcp120.dll 能否有一种方法,把程序运行所需要的环境一并打包,使之可以在任何Windows计算机上使用? 为了方便说明,我们新建一个简单的控制台应用项目,直接如图: 非常简单,一个使用了C++标准库的控制台应用程序,在装有开发环境的本机顺序执行出如下效果: 真实一个旷世奇作,我们迫不及待地就此发

2013 到1 通过最小步数 到达1 2中运算 -1 或者除以2

d[n]=min(dp[n-1]+1,dp[n.2]): n为偶数 dp[n]=dp[n-1]+1; 答案为18 怎么通过计算求得答案? #include<iostream> using namespace std; int d[2014]; int min(int x,int y) { if(x>y) return y; else return x; } int main() { int n; cin>>n; memset(d,0,sizeof(d)); d[1]=0; d

MDT 2013 从入门到精通之自动化部署Windows 8.1

上文我们介绍了有关批量部署windows 7客户端的过程,本章为大家带来有关MDT2013批量部署windows 8.1操作系统.本章内容也算是对之前系列文章的简单整合(同时本文也是针对读者对有关"MDT 2013 从入门到精通之LTI rules"文章中截图如何从何而来做回答).建议大家在使用微软产品之前对产品要有所了解,这样方便大家能更好的实施.使用微软相关产品. 一.任务序列创建: 1.添加操作系统WIM映像: 2.新建Task Sequence任务序列: 输入任务ID及Task

在windows 2012中安装sharepoint 2013时遇到问题的处理办法

众所周知,sharepoint 2013是早于windows 2012的,所以在安装的时候,总会出现各种奇怪的问题,也就是所谓的一个个坑,为了减少大家掉到坑里的次数和排除故障的时间,我在这里记录下我曾经碰到过或者别人碰到我参与解决的问题,大家互相有个借鉴. 一.装完系统后,一定要添加相关的AD  DNS IIS组件 二.安装Sql Server 2012 三.安装前置软件 前置软件的链接我从别的帖子里找出来,放到下面,重点看后面的红字 Windows Identity Extensions: h

sharepoint 2013:活动目录迁移用户后,在sharepoint中move 用户 powershell

Get-SPUser -web http://wfe1  | fl    (查看该网站集中的账户) $user = Get-SPUser -web http://wfe1 -Identity 18   (将id为18的账户赋予变量$user ,不用变量下面一条语句会失败,18也可以用用户名取代) Move-SPUser -IgnoreSID -Identity $user -NewAlias 'test\sale02'   (将该账户迁移为新账户,可以在同一个域中,也可以不同域) 该操作在web

SharePoint 2013 如何获取当前站点对应的“应用目录”中“适用于SharePoint的应用”列表

一开始我用的是以下方法,根据遍历当前站点下的Web应用程序(Web Application)中所有的网站集(Site Collection),查找模板为“APPCATALOG”的网站集,然后在它的根站点下查找功能标识为“0AC11793-9C2F-4CAC-8F22-33F93FAC18F2”的列表. 这个列表就是“应用目录”下的“适用于SharePoint应用”列表. public static SPList GetCorporateCatalog(SPWeb web) { //SPSite

MDT 2013 从入门到精通之自动化部署Windows 7

本章为大家演示如何通过MDT批量部署windows 7客户端,因本文WDS配置选项中设置启动为"继续PXE启动,除非用户按Esc键",所以这里没有出现按F12继续界面,为便于验证操作的正确性,本部署未设置全自动,Task Sequence. Computer Details .Applications需要我们手动选择,如想跳过此界面,可设置SKipTaskSequence=YES或直接指定task ID:SkipComputerName=YES:SkipDomainMembership

SharePoint 2013的限制(四)用windows explorer操作文档库

SharePoint虽然是B/S的,用浏览器就可以访问,但是很多人还是喜欢用windows explorer来和SharePoint交互. 使用Windows explorer可以像操作本地文件夹和文件一样,进行添加删除复制改名等等. 选择一个文档库,点击ribbon上的Open with Explorer: 这样就在Windows Explorer中打开了. 再打开一个本地文件夹,新建一个文件夹和文件.文件夹以.files结尾.然后把文件夹和文件拖拽到SharePoint文件夹. 这样这个文件

[MS-SQL]20130806_LocalDB_DOS命令使用

为了方便管理,LocalDB提供了一个基于命令行的数据库管理工具SqlLocalDB.exe.下面是SqlLocalDB.exe的路径: %ProgramFiles%\Microsoft SQL Server\110\Tools\Binn 也可以通过where命令寻找exe文件: 我们可以在Windows操作系统的CMD命令行中运行SqlLocalDB.exe: Cd  %ProgramFiles%\Microsoft SQL Server\110\Tools\Binn SqlLocalDB S