VS2015編寫的C++程序發布到全新的Win7系統需要什麼條件?

用VS2015編寫C++程序需要發布到全新的win7系統時,各種彈少DLL的框...如圖所示,後面的未選中的還可以理解,前面的是什麼東西?我添加完這些dll後debug版程序是可以運行的。但是換到release版時,提示缺少不一樣的dll,複製後還會彈無法鏈接到dll的函數,暈!(我知道dll是分debug和release版本的,但是有幾個dll確實全試了仍然報錯)而且,那些缺少的dll同名版本太多了..

Q:難道沒人管管嗎?有什麼好的解決方案呢?

就是這個dll導致release版本的程序無法運行,我已經試了所有的dll版本..都報這個錯


使用靜態鏈接,把VS2015的運行時帶進去,也就只會多個500k。


正確的做法有兩種。

一種是要求用戶安裝對應版本的vc runtime。這東西通常叫vc 2015 redistributable這樣的名字。請選對32/64位的版本。你可以把這東西附在安裝包里。

一種是靜態鏈接。直接把vc runtime鏈接到你的exe里。這會使你的exe體積變大一些。

手工複製dll是種不怎麼推薦的土方法。雖然也能work。

另外,按協議,debug版本的crt是不應該發布給用戶的。

微軟推薦使用第一種辦法。因為vc runtime以後可以接收更新,提升性能修bug。而且程序多起來的時候,節省硬碟和內存空間。

最後,希望題主多學習一下有關CRT、lib、鏈接方式上的基礎知識,這對C、C++開發者來說是很重要的。


你發布到win10也一樣是缺少。

debug和release用的庫是不同的,要麼你複製dll到自己程序目錄,要麼靜態編譯,要麼同時發布vc++運行時安裝程序。

我覺得你應該學習一下程序查找dll的原理,比如各個目錄的優先順序等。

漏掉dll的話可以用dependancy walker查找。


發布之前當然必須要測試,前提是要有個全新的真機或者虛擬機環境

然後注意以下事項:

1、只允許發布Release版本給最終用戶

2、①安裝程序中直接捆綁提供Visual C++ Redistributable

②安裝程序檢測Visual C++ Redistributable是否存在並在不存在時給出微軟官方下載頁面鏈接並拒絕安裝。


我說點實用的,其實很多c++和新系統的新特性日常都用不到,所以你做到以下3點就可以xp以上通吃了:

1,「項目屬性,C/C++,代碼生成」,「運行庫改」為「多線程(/MT)」。

* MT開頭的是靜態引用,MD開頭的是動態引用,d結尾的是Debug調試版本,沒有d的是Release發布版本,所以就一 共有四個選項。

2,「項目屬性,鏈接器,系統」, 「所需的最低版本」,修改為「5.01」。

* 5.01表示windows 2000 with sp1版本。

3,如果用到了類似direct2d這樣新系統才有的組建,使用動態鏈接的方法,關鍵詞,loadlibrary。


VC 2015 的 runtime 依賴 Universal CRT

而這個東西對 win7 win8 來說是要裝一些亂七八糟的系統更新的

像我這種萬年不更新的,從來不裝這東西

想減少依賴?換 VC 2013 的 runtime 或者用mingw

MS 的東西真的越來越爛了

PS:也是因為這個東西,Python 3 分成了 3.5 和 3.4 兩條線

垃圾 Python 社區,媽的


先叫對方確認自己的Windows 7帶了SP1,然後給他靜態連接的版本。

如果還不行那就是他自己的問題。


感覺微軟瞎折騰的本事真是挺大的,每次推出新東西都要坑開發者和用戶,WP那一攤子都過去式了就不說了,單說VC,VC6的時候,編譯出來的可執行文件發布起來非常簡單,到了VC7往後的版本,說是為了解決DLL版本混亂的問題,搞了個.manifest。再到新版本,連安裝VC的redist都要求系統安裝某補丁,默認還不支持老系統,每次把程序拷到別人電腦上折騰半天還跑不起來的時候都讓人想罵娘。反觀Linux,人家提供的解決方法簡單粗暴,給DLL弄幾個符號鏈接,加上各級版本號,想鏈接哪個就鏈接哪個,libxxx.so, libxxx.1.so, libxxx.1.0.so, libxxx.1.0.0.so,哎……

也許以後在windows上開發首選的環境該是MINGW了……

------------------------------------------

編輯下。

之所以來到這個問題是因為我也遇到這個問題,百度搜來的。我為了解析某種特殊的內部協議,自己寫了個wireshark的特製版本,用vc2015編譯的,弄好了發現在同事電腦上跑不起。直覺告訴我是vc運行時沒裝,到vc2015目錄下拷貝vc_redist來安裝,報錯不讓裝!網上說得安裝sp1補丁(win7),不是在逗我吧?用戶電腦上都要裝sp1?

於是我開始把缺少的dll從我開發系統的目錄下拷出來,拿到運行的機器上,這裡我用了個神奇的工具,叫depends.exe,可以分析程序的運行時依賴。這裡一定要注意32位和64位的區別,如果開發機系統和程序同為32位或64位就去windowssystem32目錄下拷,如果開發機系統是64位而程序是32位,就要去windowssyswow64下去拷,system32下的是64位的。

都拷到可執行文件的目錄下,隨時試試能不能跑。你最後那個彈框是因為沒拷ucrtbase.dll,拷了就好了。


說實話,如果你的程序使用了DLL的話,不建議用MT模式發布,最好叫客戶安裝vc運行庫Visual C++ Redistributable。如果你的DLL靜態鏈接了CRT庫,然後你的exe動態鏈接CRT庫,很容易出問題。參考:https://msdn.microsoft.com/zh-cn/library/ms235460.aspx


vs2015可以在工程屬性中選擇編譯器版本,你可以選用2010的編譯器,這樣的話,vs2015會自動切換使用對應的win7頭文件,只是這樣就不能使用c++最新的功能,但你依然可以使用2015提供的強大工具,如新添加的性能診斷工具


補充下輪子哥的,release時,打開項目屬性里選靜態鏈接,還有用MT,而不是mtd mdd之類。

還有使用depends工具查看程序依賴那些dll,選擇靜態編譯得到的exe會少依賴一些dll


具體根據自己系統進行更改

還有,提問之前記得先google一下,這個問題各種論壇上有不少的解決方案呢。


推薦閱讀:

公司必須用vs2005生產,可是我想用vs2013來編寫,然後用vs2005編譯,有什麼好辦法嗎?
Visual Studio 有哪些比較偏但是非常強大的功能?
微軟有必要開發 Visual Studio for Linux 嗎,如有必要,那麼會產生什麼影響?
Visual Studio Code 是如何辦到高效處理大文件的?
Visual Studio 支持 C 嗎?

TAG:C | MicrosoftVisualStudio |