五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > 關(guān)于VS項目平臺的x86,x64,Any CPU以及Debug和Release的區(qū)別和注意事項

關(guān)于VS項目平臺的x86,x64,Any CPU以及Debug和Release的區(qū)別和注意事項

文章來源:365jz.com     點擊數(shù):1223    更新時間:2020-04-25 01:03   參與評論

相信對于很多剛接觸打包程序的同志來說,關(guān)于x86,x64,Any CPU這三個項目平臺,以及解決方案配置Debug和Release有什么區(qū)別?這個問題一定有許多的困惑,甚至不乏一些已經(jīng)工作了很久的老程序猿來說都是一個模棱兩可的問題。當然,我也是搗騰了好久,才漸漸搞明白它們的區(qū)別,以此作個總結(jié):

32位系統(tǒng)需要x86指令集來運行。
64位系統(tǒng)需要x64(有時也叫x86-64或者amd64,我分不清仨名字有啥區(qū)別,感覺是一樣的)指令集來運行。
----
一個CPU可以同時支持x86指令集和amd64指令集。

一 、x86、x64、Any CPU的區(qū)別

  1. 簡單的說,它們之間最直接的區(qū)別就是:x86平臺編譯出來的exe(可執(zhí)行文件)或dll(動態(tài)鏈接庫)都是32位的。以此類推,x64對應的則是64位的。而Any CPU則是取決于當前的操作系統(tǒng),若操作系統(tǒng)是32位的,則編譯出來的程序就是32位的,反之編譯出來的就是64位程序。

  2. 若你的啟動項目,即主程序(編譯出來是exe文件的)是x86平臺下編譯的,而它所依賴的一個項目(或動態(tài)鏈接庫)是由x64位平臺編譯出來的,則會提示“未能加載文件或程序集...或它的某一個依賴性。試圖加載格式不正確的程序?!敝惖腻e誤。這是因為32位程序不能加載64位的dll,更不能調(diào)用其中的類、方法和對象等。反之,若主程序是由x64平臺編譯出來的,而dll是x86的呢?答案。。也是不行的!說到這里,基本上可以確定一點:dll和主程序的生成平臺只要一致就可以。那么問題來了!若主程序是Any CPU編譯的,而dll是由x86或者x64平臺編譯的,又或者,主程序是x86或者x64平臺編譯的,而dll是由Any CPU編譯的呢?正確答案就是兩者在“特殊情況”下都是可行的。為什么說是“特殊情況”下呢?因為第一點(紅色字體處)也提到了,Any CPU取決于操作系統(tǒng),而結(jié)合第二點上半部分(紅色字體處)提到的,只要dll和主程序的生成平臺一致,那么也是可行的。所以,由上可知:若主程序是在Any CPU平臺下編譯的,那么編譯dll的平臺必須要和編譯主程序的操作系統(tǒng)一致才行。若主程序是在x86或者x64平臺下編譯的,那么dll就必須要和主程序一致。不過有個特例:若dll由Any CPU編譯的,那么這個dll就可以被32位和64位的主程序調(diào)用。這是為什么呢?請看第三點。

  3. 雖說Any CPU編譯出來的程序取決于操作系統(tǒng),但是由Any CPU編譯出來dll則取決于調(diào)用它的主程序,即若主程序是32位的,那么dll也是32位的,若主程序是64位的,那么dll就是64位的。所以dll一般采用Any CPU平臺編譯,而主程序一般采用x86平臺編譯。

  4. 使用x86平臺調(diào)試的時候,是可以一邊調(diào)試一邊修改代碼的,而x64平臺下則不行(啟用了編輯并繼續(xù)的)。如下圖:

  5. 1

  6. 調(diào)試時修改代碼提示如下:

  7. 3

  8. 總結(jié):了解了它們的區(qū)別之后,我們打包程序的時候就知道如何取舍了。一般來說,在不清楚客戶的電腦是什么類型的操作系統(tǒng)的情況下,或者兩者都有的時候,則主程序采用x86平臺編譯,dll采用Any CPU平臺編譯。若清楚的知道是64位操作系統(tǒng),那么就可以都按x64平臺編譯了。

    二、Debug和Release的區(qū)別

    1. Debug通常稱為調(diào)試版本,它包含調(diào)試信息,并且不作任何優(yōu)化,便于程序員調(diào)試程序。Release稱為發(fā)布版本,它往往是進行了各種優(yōu)化,使得程序在代碼大小和運行速度上都是最優(yōu)的,以便用戶很好地使用。所以一般都是用Release來打包發(fā)布程序,另外,Release打包出來的程序也相對來說會小一些。

    2. 在Release模式下是不能一邊調(diào)試一邊修改代碼的(啟用了編輯并繼續(xù)的)。調(diào)試時修改代碼提示如下圖:

    3. 4

    4. 錯誤:面向“AMD64”的文件“xxxxx”與項目的目標平臺“x86”不兼容

x64_1

是“x64”,沒錯呀!重新清理了下項目,然后在安裝項目里重新添加主輸出,然后重新編譯發(fā)布。。。發(fā)現(xiàn)還是那個提示。。。

就在毫無頭緒的時候,突然瞄到了安裝項目的屬性窗口(下圖,部署項目屬性窗口,F(xiàn)4打開的,不是右鍵屬性的那個)里有個TargetPlatform(目標平臺)屬性,設(shè)置的是“x86”?。?!原來這才是錯誤消息所說的“目標平臺”!知道了原因,改起來就容易了。把這個TargetPlatform的值設(shè)置成“x64”,再重新打包生成的就是64位安裝包了!

0

對了,關(guān)鍵就是在于安裝項目的屬性窗口離的TargetPlatform(目標平臺),如果設(shè)置了x64,那么打包出來的安裝包只能在64位的計算機上安裝。如果設(shè)置了x86,則可以在64位的計算機上安裝。不過默認是安裝在 Program Files (x86) 目錄下的,而64位程序則是安裝在Program Files目錄下的。

VS x86 x64 anycpu 編譯運行對照表

image.png


一、Debug和Release的區(qū)別

  Debug:調(diào)試版本,包含調(diào)試信息,所以容量比Release大很多,并且不進行任何優(yōu)化(優(yōu)化會使調(diào)試復雜化,因為源代碼和生成的指令間關(guān)系會更復雜),便于程序員調(diào)試。Debug模式下生成兩個文件,除了.exe或.dll文件外,還有一個.pdb文件,該文件記錄了代碼中斷點等調(diào)試信息 

  Release:發(fā)布版本,不對源代碼進行調(diào)試,編譯時對應用程序的速度進行優(yōu)化,使得程序在代碼大小和運行速度上都是最優(yōu)的。(調(diào)試信息可在單獨的PDB文件中生成)。Release模式下生成一個文件.exe或.dll文件

 

二、Obj文件夾的作用
  obj目錄中也有debug和release兩個子目錄,obj目錄是項目生成dll的源目錄,然后將生成好的dll復制到bin目錄下。obj用于存放編譯過程中生成的中間臨時文件。在.Net中,編譯時分模塊進行的,每個模塊的編譯結(jié)果都保存在obj目錄下,最后會合并為一個.exe或則.dll文件保存到bin目錄下。
  因為每次編譯都是增量編譯,也就是只重新編譯改變了的模塊,所以這個obj目錄的作用就是保存這些小塊的編譯結(jié)果,加快編譯速度。

 

三、Debug 和 Release 編譯方式的本質(zhì)區(qū)別

Debug 通常稱為調(diào)試版本,它包含調(diào)試信息,并且不作任何優(yōu)化,便于程序員調(diào)試程序。Release 稱為發(fā)布版本,它往往是進行了各種優(yōu)化,使得程序在代碼大小和運行速度上都是最優(yōu)的,以便用戶很好地使用。
Debug 和 Release 的真正秘密,在于一組編譯選項。下面列出了分別針對二者的選項(當然除此之外還有其他一些,如/Fd /Fo,但區(qū)別并不重要,通常他們也不會引起 Release 版錯誤,在此不討論)

Debug 版本:
/MDd /MLd 或 /MTd 使用 Debug runtime library(調(diào)試版本的運行時刻函數(shù)庫)
/Od 關(guān)閉優(yōu)化開關(guān)
/D "_DEBUG" 相當于 #define _DEBUG,打開編譯調(diào)試代碼開關(guān)(主要針對assert函數(shù))
/ZI 創(chuàng)建 Edit and continue(編輯繼續(xù))數(shù)據(jù)庫,這樣在調(diào)試過程中如果修改了源代碼不需重新編譯
/GZ 可以幫助捕獲內(nèi)存錯誤
/Gm 打開最小化重鏈接開關(guān),減少鏈接時間

Release 版本:
/MD /ML 或 /MT 使用發(fā)布版本的運行時刻函數(shù)庫
/O1 或 /O2 優(yōu)化開關(guān),使程序最小或最快
/D "NDEBUG" 關(guān)閉條件編譯調(diào)試代碼開關(guān)(即不編譯assert函數(shù))
/GF 合并重復的字符串,并將字符串常量放到只讀內(nèi)存,防止被修改


實際上,Debug 和 Release 并沒有本質(zhì)的界限,他們只是一組編譯選項的集合,編譯
器只是按照預定的選項行動。事實上,我們甚至可以修改這些選項,從而得到優(yōu)化過的調(diào)
試版本或是帶跟蹤語句的發(fā)布版本。




如對本文有疑問,請?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會為你解答??! 點擊進入論壇

發(fā)表評論 (1223人查看0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學習

業(yè)務咨詢

· 技術(shù)支持
· 服務時間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號