部署VC2008應用程式
轉自:http://blog.csdn.net/laiboy/article/details/5038165
如果你編譯了一個VC2008的預設的CRT/MFC的應用程式,如果目標部署電腦上沒有安裝相應的VC2008的動態庫,當執行你的程式的時個,會出現如下錯誤資訊.
這是因為程式使用了基於VC2008的CRT/MFC的動態庫版本.
解決這個問題,有三種方法:
1.使用靜態連結庫編譯(缺點,生成的exe的程式過於龐大)
2.使用vcredist_x86.exe / vcredist_x64.exe 將VC2008的發行版的DLL安裝在你的系統上.(缺點,只能支援發行版,除錯版程式不能支援)
3.將你的程式依賴的CRT/MFC的動態庫與你的程式一起釋出(放在與你的釋出程式同一目錄中)
第一種和第二種就不詳細講如何實現了,只要講第三種方法如何實現.優其是程式的開發是使用了VC2008 SP1的版本開發的程式.
在你的VC2008的安裝目錄下有兩個目錄,
- C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT
- C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.MFC
只要將這兩個目錄下的檔案一同拷貝到釋出程式的同一目錄下:
- Microsoft.VC90.CRT.manifest
- msvcr90.dll
- msvcp90.dll
- msvcm90.dll
- Microsoft.VC90.MFC.manifest
- mfc90.dll
- mfc90u.dll
- mfcm90.dll
mfcm90u.dll
這些是這個程式依賴的發行版動態庫,同理,如果是除錯版的釋出程式,也一樣把相應的除錯動態庫拷貝到相應目錄.
程式如你意執行起來了!
但是,如果你安裝的是VC2008 SP1的版本的時候,問題就來了,你的程式也一樣執行不起來了!
原因就是安裝了VC2008 SP1的時候,它把"VC/redist"用新的版本檔案代替了,問題不大,但是,這個程式的版本是依賴於新的manifest的檔案的,當你編譯VC2008-SP1的程式的時候,它同時把RTM-version寫入程式的manifest檔案中,這個是舊的RTM-version,不與新版本的VC2008-SP1的"CRT/MFC"manifest版本一致,因此程式執行的時候是拒絕匯入這些新的VC2008-SP1的CRT/MFC的運態庫!
解決方法有兩種.
方法一:
最簡單的,修改Microsoft.VC90.CRT.manifest和Microsoft.VC90.MFC.manifest檔案,將新的版本號改為舊的版本號,如果是依賴其它的Microsoft.VC90.*.manifest的檔案,也同樣是如此修改!
如果是裝了VC2008-SP1後,它的版本號是“9.0.30729.8″
未裝VC2008-SP1前的版本號為"9.0.21022.8"
過程如下:
將所依的動態庫及它們的 manifest 檔案拷貝到釋出應用程式的同一目錄下,並修改Microsoft.VC90.*.manifest檔案,將
version="9.0.30729.1" 修改為 version="9.0.21022.8" 恭喜你,你的程式執行起來了! 方法二 修改你的程式的所依賴的manifest,這樣程式會依整於新的manifest. 過程如下: 在stdafx.h 這個檔案中,增加如下巨集定義: #define _BIND_TO_CURRENT_VCLIBS_VERSION 1 程式編譯後就會依賴於新的manifest,版本號為 "9.0.30729.1" 無須再修改manifest檔案中的version版本號了. 將所依的動態庫的及它們的 manifest 檔案拷貝到釋出應用程式的同一目錄下 恭喜你,程式又執行起來了! 注意:如果你是想要新的MFC-feature-pack的功能,用這種方法是最好的. 注意一點,非常重要,如果已經安裝了vcredist_*.exe程式包,注意的是Dll會自動把引用調到系統目錄下的WinSxS目錄下的,即不再引用同一目錄下的動態庫! 如果是編譯時使用了(/clr)這個編譯選項去支援.net開發,你必須要安裝.net framework redistributable包! 不過,在2010,編譯的程式會不再需要manifest檔案!
相關文章
- 輕鬆部署 Laravel 應用 | 《08. 手動部署 - 部署應用程式碼》Laravel
- Azure Terraform(三)部署 Web 應用程式ORMWeb
- zt_websphere如何部署應用程式Web
- 學用Java Web Start 部署應用程式 (轉)JavaWeb
- Docker中部署.NET CORE應用(控制檯應用程式篇)Docker
- wildfly 21中應用程式的部署
- websphere如何部署應用程式_中介軟體Web
- Vue.js應用程式容器化部署Vue.js
- RAC環境中的應用程式部署——RAC部署和效能
- RMI應用部署
- 學習在雲上部署Java應用程式Java
- ZooKeeper 基礎知識、部署和應用程式
- .NET Core應用程式的2種部署方式
- 介紹RAC環境中的應用程式部署——RAC部署和效能
- Docker部署Angular應用DockerAngular
- Flask 應用如何部署Flask
- EJB 部署及應用
- LNMP部署及應用LNMP
- 如何在阿里雲上部署 Django 應用程式阿里Django
- Docker容器學習梳理 - 應用程式容器環境部署Docker
- Spark1.0.0 應用程式部署工具spark-submitSparkMIT
- 用 Jenkins 部署 PHP 應用JenkinsPHP
- 簡單的Cloud Toolkit教程,助你秒部署應用程式Cloud
- 阿里canal部署和應用阿里
- 使用 Docker 部署 Node 應用Docker
- Docker常用的應用部署Docker
- nginx + uWSGI + flask應用部署NginxFlask
- 快速應用部署的方法
- SQLCoder部署和應用SQL
- golang: 線上上用nginx部署應用GolangNginx
- Websphere安裝、企業部署應用 【應用案例】Web
- 快速搞懂.NET 5/.NET Core應用程式的釋出部署
- WebSphere(was8.5)安裝簡單應用程式部署安裝Web
- 部署Node應用程式選擇Heroku還是Now.sh?
- WinForm 應用程式的打包和部署_簡單版(圖文)ORM
- 用 Ansible 部署無服務應用!
- 用JavaFX構建部署Android應用JavaAndroid
- 將Laravel應用部署到HerokuLaravel