vc編譯32位
1. VC2005如何設置可以兼容32位程序的編譯
新建項目,點擊VisualC++,在右邊選擇Win32控制台應用程序,輸入項目名稱,下一步…余爛…(按塌帆你自己的需要去做,但vc2005的語法和豎衫漏vc6.0的有些差別了,要注意哦~~~)
2. VC++2012配置好x64解決方案平台,編譯出的軟體為什麼還是32位的
你的程序設置選項上,估計是沒設置對。
3. 如何在各個版本的VC及64位下使用CPUID指令
、推薦使用__cpuid、__cpuidex等Intrinsics函數
32位模式我使用內嵌匯編調用cpuid指令64位模式VC編譯器支持內嵌匯編
於微軟提供Intrinsics函數——編譯器Intrinsics函數編譯應機器指令且同支持32位64位
例CPUID指令應Intrinsics函數——
[cpp] view plain
//
void __cpuid(
int CPUInfo[4],
int InfoType
);
void __cpuidex(
int CPUInfo[4],
int InfoType,
int ECXValue
);
__cpuidex函數InfoType參數CPUID指令eax參數即功能IDECXValue參數CPUID指畝備消令ecx參數即功能IDCPUInfo參數用於接收輸eax, ebx, ecx, edx四寄存器
早期CPUID功能需要功能ID參數(eax)使用__cpuid函數
CPUID功能越越強功能ID參數(eax)參數夠用於加功能ID(ecx)參數應該採用__cpuidex
二、用條件編譯判斷VC編譯器Intrinsics函數支持性(_MSC_VER)
__cpuid、__cpuidex等Intrinsics函數遇問題——
1.低版本VC編譯器沒intrin.h文件【注】:VC2005(或更高)才擁intrin.h支持__cpuid
2.低版本VC編譯器支持__cpuidex【注】:VC2008部版本及VS2011(或更高)intrin.h才__cpuidex
使用條件編譯判斷VC編譯器版本
_MSC_VER微軟C/C++編譯器——cl.exe編譯代碼預定義宏值表示cl版本類型int例——
#if _MSC_VER >=1200 // VC++6.0
#if _MSC_VER >=1300 // VC2003
#if _MSC_VER >=1400 // VC2005
#if _MSC_VER >=1500 // VC2008
#if _MSC_VER >滾鬧=1600 // VC2011
例發現_MSC_VER於等於1400我#include 再利用_MSC_VER進步判斷__cpuid、__cpuidex支持性
三、用條件編譯判斷64位模式(_WIN64)
使用_WIN64預處理宏用判斷目標平台64位
雖編譯x64平台程序編譯器自推導_WIN64Visual Studio語高亮清楚些能仍按32位代碼做語高亮所建議手項目預處理宏增加_WIN64
四、32位用內嵌匯編實現__cpuidex函數
32位模式我使用內嵌匯編實現__cpuidex函數代碼——
[cpp] view plain
void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
{
if (NULL==CPUInfo) return;
_asm{
// load. 讀取參數寄存器
mov edi, CPUInfo; /迅知/ 准備用edi定址CPUInfo
mov eax, InfoType;
mov ecx, ECXValue;
// CPUID
cpuid;
// save. 寄存器保存CPUInfo
mov [edi], eax;
mov [edi+4], ebx;
mov [edi+8], ecx;
mov [edi+12], edx;
}
}
五、全部代碼
全部代碼——
[cpp] view plain
#include
#include
#include
#if _MSC_VER >=1400 // VC2005才支持intrin.h
#include // 所Intrinsics函數
#endif
char szBuf[64];
INT32 dwBuf[4];
#if defined(_WIN64)
// 64位支持內聯匯編. 應使用__cpuid、__cpuidex等Intrinsics函數
#else
#if _MSC_VER < 1600 // VS2011. 據說VC2008 SP1才支持__cpuidex
void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
{
if (NULL==CPUInfo) return;
_asm{
// load. 讀取參數寄存器
mov edi, CPUInfo; // 准備用edi定址CPUInfo
mov eax, InfoType;
mov ecx, ECXValue;
// CPUID
cpuid;
// save. 寄存器保存CPUInfo
mov [edi], eax;
mov [edi+4], ebx;
mov [edi+8], ecx;
mov [edi+12], edx;
}
}
#endif // #if _MSC_VER < 1600 // VS2011. 據說VC2008 SP1才支持__cpuidex
#if _MSC_VER < 1400 // VC2005才支持__cpuid
void __cpuid(INT32 CPUInfo[4], INT32 InfoType)
{
__cpuidex(CPUInfo, InfoType, 0);
}
#endif // #if _MSC_VER < 1400 // VC2005才支持__cpuid
#endif // #if defined(_WIN64)
// 取CPU廠商(Vendor)
//
// result: 功返字元串度(般12)失敗返0
// pvendor: 接收廠商信息字元串緩沖區至少13位元組
int cpu_getvendor(char* pvendor)
{
INT32 dwBuf[4];
if (NULL==pvendor) return 0;
// Function 0: Vendor-ID and Largest Standard Function
__cpuid(dwBuf, 0);
// save. 保存pvendor
*(INT32*)&pvendor[0] = dwBuf[1]; // ebx: 前四字元
*(INT32*)&pvendor[4] = dwBuf[3]; // edx: 間四字元
*(INT32*)&pvendor[8] = dwBuf[2]; // ecx: 四字元
pvendor[12] = '\0';
return 12;
}
// 取CPU商標(Brand)
//
// result: 功返字元串度(般48)失敗返0
// pbrand: 接收商標信息字元串緩沖區至少49位元組
int cpu_getbrand(char* pbrand)
{
INT32 dwBuf[4];
if (NULL==pbrand) return 0;
// Function 0x80000000: Largest Extended Function Number
__cpuid(dwBuf, 0x80000000);
if (dwBuf[0] < 0x80000004) return 0;
// Function 80000002h,80000003h,80000004h: Processor Brand String
__cpuid((INT32*)&pbrand[0], 0x80000002); // 前16字元
__cpuid((INT32*)&pbrand[16], 0x80000003); // 間16字元
__cpuid((INT32*)&pbrand[32], 0x80000004); // 16字元
pbrand[48] = '\0';
return 48;
}
int _tmain(int argc, _TCHAR* argv[])
{
//__cpuidex(dwBuf, 0,0);
//__cpuid(dwBuf, 0);
//printf("%.8X\t%.8X\t%.8X\t%.8X\n", dwBuf[0],dwBuf[1],dwBuf[2],dwBuf[3]);
cpu_getvendor(szBuf);
printf("CPU Vendor:\t%s\n", szBuf);
cpu_getbrand(szBuf);
printf("CPU Name:\t%s\n", szBuf);
return 0;
}
六、兼容性說明
VC編譯器32/64位支持性——
32位:VC6早支持編譯32位Intrinsics函數
64位:VC2005早支持編譯64位Intrinsics函數
本文32位編譯器兼容性——
__cpuid:兼容VC6(或更高)
__cpuidex:兼容VC6(或更高)
本文64位編譯器兼容性——
__cpuid:兼容VC2005(或更高)
__cpuidex:兼容VC2011(或更高)
4. visual c++ 分32位系統和64位系統么
Microsoft Visual C++,(簡稱Visual C++、MSVC、VC++或VC)是Microsoft公司推出的開發Win32環境程序,面向對象的可視化集成編程系統。它不但具有程序框架自動生成、靈活方便的類管理、代碼編寫和界面設計集成交互操作、可開發多種程序等優點,而且通過簡單的設置就可使其生成的程序框架支持資料庫介面、OLE2,WinSock網路、3D控制界面。
Microsoft Visual C++ 1.0
集成了MFC2.0,是Visual C++第一代版本,1992年推出,可同時支援16位處理器與32位處理器版,是Microsoft C/C++ 7.0的更新版本。
Microsoft Visual C++ 1.5
集成了MFC2.5,增加了「目標文件鏈接嵌入 (OLE)2.0 和支持MFC的開放式資料庫鏈接(ODBC)。這個版本只有16位的,也是第一個以CD-ROM為軟體載體的版本。這個版本也沒有所謂「標准版」。它是最後一個支持16位軟體編程的軟體,也是第一個支持基於x86機器的32位編程軟體。
Microsoft Visual C++ 2.0
集成了MFC 3.0,第一個只發行32位的版本。這個版本提前發行了,幾乎成了一個「丟失的版本」。這是因為那個時候Windows 95(開發代碼為"Chicago")還沒有發行,而Windows NT又只佔有很小的市場份額。該版本用戶可以通過微軟公司的訂閱服務(Microsoft Subscription Service)升級至2.1和2.2版本。微軟公司在這個版本中集成並升級了Visual C++1.5,作為2.0版本(Visual C++ 1.5升級後版本號:1.51)以及2.1版本(Visual C++1.5升級後版本號:1.52)的一部分。Visual C++ 2.x附帶了16位和32位版本的CDK,同時支持Win32s的開發。Visual C++ 2.2及其後續版本不再升級Visual C++ 1.5(盡管它一直被集成至Visual C++ 4.x)。盡管出生的比Windows 95早,這個版本的發行日期還是非常接近Windows 95,可是當Windows 95發行時, Visual C++ 4.0也已經發行了。因此很多程序開發者直接從1.x過渡到4.0,把2.x跳過去了。
Microsoft Visual C++ 4.0
集成了MFC4.0,這個版本是專門為Windows 95以及Windows NT設計的。用戶可以通過微軟公司的訂閱服務(MicrosoftSubscription Service)升級至4.1和4.2版本(此版本不再支持Win32s開發)。
Microsoft Visual C++ 5.0
集成了MFC 4.21,是4.2版以來比較大的一次升級。
Microsoft Visual C++ 6.0
集成了MFC6.0,於1998發行。發行至今一直被廣泛地用於大大小小的項目開發。但是,這個版本在WindowsXP下運行會出現問題,尤其是在調試模式的情況下(例如:靜態變數的值並不會顯示)。 這個調試問題可以通過打一個叫「Visual C++ 6.0Processor Pack」的補丁來解決。奇怪的是,這個網頁強調用戶也必須運行Windows 98、Windows NT4.0、或Windows 2000。這個C++版本對win7的兼容性非常差,有大大小小的兼容性問題。微軟不推薦安裝在windows7上。
MicrosoftVisual C++ .NET 2002
也即Visual C++ 7.0,於2002年發行,集成了MFC7.0,支持鏈接時代碼生成和調試執行時檢查。這個版本還集成了Managed Extension for C++,以及一個全新的用戶界面(與Visual Basic和Visual C#共用)。從這個版本開始,所有的API形式上都被定義成位數無關的,並且開始支持原生64位軟體的開發。
MicrosoftVisual C++ .NET 2003
也即 Visual C++ 7.1,集成了MFC 7.1,於2003年發行,是對Visual C++ .NET 2002的一次重大升級。
MicrosofteMbedded Visual C++
用於Windows CE操作系統。Visual C++作為一個獨立的開發環境被Microsoft Visual Studio 2005所替代。
MicrosoftVisual C++ 2005
也即Visual C++ 8.0,集成了MFC 8.0,於2005年11月發布。這個版本引進了對C++/CLI語言和OpenMP的支持。
MicrosoftVisual C++ 2008
也即Visual C++ 9.0,於2007年11月發布。這個版本支持.NET 3.5。從這個版本開始,微軟放棄了對編寫Win9x架構系統上的軟體的支持。此版本更加穩定。VC++2008是目前最穩定版本。
MicrosoftVisual C++ 2010
Visual C++ 10.0,2009年發布,新添加了對C++11標准引入的幾個新特性的支持。
MicrosoftVisual C++ 2012
Visual C++ 11.0, 2012年5月26日發布,支持.net4.5 beta,並實現go live。只能安裝於win7或者更高的windows操作系統(如最新發布的windows8等)。可以開發windows8專用的Modern UI風格的應用程序。相比2010又添加了少量對C++11標准引入的新特性的支持。
MicrosoftVisual C++ 2013
Visual C++ 12.0, 2013年8月發布,可以看作是Visual C++ 11.0的升級版。這個版本相對於2012添加了大量對C++11標準的支持。可以開發windows8.1專用的Modern UI風格的應用程序(但卻不支持windows8,支持windows8.1)。開發環境亦內置了源代碼染色的功能。
最新穩定版本(亦適用於2013)
Visual C++ 被整合在Visual Studio之中,但仍可單獨安裝使用。
參考資料:網路
5. 如何在各個版本的VC及64位下使用CPUID指令
、推薦使用__cpuid、__cpuidex等Intrinsics函數
32位模式我使用內嵌匯編調用cpuid指令64位模式VC編譯器支持內嵌匯編
於微軟提供Intrinsics函數——編譯器Intrinsics函數編譯應機器指令且同支持32位64位
滾鬧例CPUID指令應Intrinsics函數——
[cpp] view plain
//
void __cpuid(
int CPUInfo[4],
int InfoType
);
void __cpuidex(
int CPUInfo[4],
int InfoType,
int ECXValue
);
__cpuidex函數InfoType參數CPUID指令eax參數即功能IDECXValue參數CPUID指令ecx參數即功能IDCPUInfo參數用於接收輸eax, ebx, ecx, edx四寄存器
早期CPUID功能需要功能ID參數(eax)使用__cpuid函數
CPUID功能畝備消越越強功能ID參數(eax)參數夠用於加功能ID(ecx)參數應該採用__cpuidex
二、用條件編譯判斷VC編譯器Intrinsics函數支持性(_MSC_VER)
__cpuid、__cpuidex等Intrinsics函數遇問題——
1.低版本VC編譯器沒intrin.h文件【注】:VC2005(或更高)才擁intrin.h支持__cpuid
2.低版本VC編譯器支持__cpuidex【注】:VC2008部版本及VS2011(或更高)intrin.h才__cpuidex
使用條件編譯判斷VC編譯器版本
_MSC_VER微軟C/C++編譯器——cl.exe編譯代碼預定義宏值表示cl版本類型int例——
#if _MSC_VER >=1200 // VC++6.0
#if _MSC_VER >=1300 // VC2003
#if _MSC_VER >=1400 // VC2005
#if _MSC_VER >=1500 // VC2008
#if _MSC_VER >=1600 // VC2011
例發現_MSC_VER於等於1400我#include 再利用_MSC_VER進步判斷__cpuid、__cpuidex支持性
三、用條件編譯判斷64位模式(_WIN64)
使用_WIN64預處理宏用判斷目標平台64位
雖編譯x64平台程序編譯器自推導_WIN64Visual Studio語高亮清楚些能仍按32位代碼做語高亮所建議手項目預處理宏增加_WIN64
四、32位用內嵌匯編實現__cpuidex函數
32位模式我使用內迅知嵌匯編實現__cpuidex函數代碼——
[cpp] view plain
void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
{
if (NULL==CPUInfo) return;
_asm{
// load. 讀取參數寄存器
mov edi, CPUInfo; // 准備用edi定址CPUInfo
mov eax, InfoType;
mov ecx, ECXValue;
// CPUID
cpuid;
// save. 寄存器保存CPUInfo
mov [edi], eax;
mov [edi+4], ebx;
mov [edi+8], ecx;
mov [edi+12], edx;
}
}
五、全部代碼
全部代碼——
[cpp] view plain
#include
#include
#include
#if _MSC_VER >=1400 // VC2005才支持intrin.h
#include // 所Intrinsics函數
#endif
char szBuf[64];
INT32 dwBuf[4];
#if defined(_WIN64)
// 64位支持內聯匯編. 應使用__cpuid、__cpuidex等Intrinsics函數
#else
#if _MSC_VER < 1600 // VS2011. 據說VC2008 SP1才支持__cpuidex
void __cpuidex(INT32 CPUInfo[4], INT32 InfoType, INT32 ECXValue)
{
if (NULL==CPUInfo) return;
_asm{
// load. 讀取參數寄存器
mov edi, CPUInfo; // 准備用edi定址CPUInfo
mov eax, InfoType;
mov ecx, ECXValue;
// CPUID
cpuid;
// save. 寄存器保存CPUInfo
mov [edi], eax;
mov [edi+4], ebx;
mov [edi+8], ecx;
mov [edi+12], edx;
}
}
#endif // #if _MSC_VER < 1600 // VS2011. 據說VC2008 SP1才支持__cpuidex
#if _MSC_VER < 1400 // VC2005才支持__cpuid
void __cpuid(INT32 CPUInfo[4], INT32 InfoType)
{
__cpuidex(CPUInfo, InfoType, 0);
}
#endif // #if _MSC_VER < 1400 // VC2005才支持__cpuid
#endif // #if defined(_WIN64)
// 取CPU廠商(Vendor)
//
// result: 功返字元串度(般12)失敗返0
// pvendor: 接收廠商信息字元串緩沖區至少13位元組
int cpu_getvendor(char* pvendor)
{
INT32 dwBuf[4];
if (NULL==pvendor) return 0;
// Function 0: Vendor-ID and Largest Standard Function
__cpuid(dwBuf, 0);
// save. 保存pvendor
*(INT32*)&pvendor[0] = dwBuf[1]; // ebx: 前四字元
*(INT32*)&pvendor[4] = dwBuf[3]; // edx: 間四字元
*(INT32*)&pvendor[8] = dwBuf[2]; // ecx: 四字元
pvendor[12] = '\0';
return 12;
}
// 取CPU商標(Brand)
//
// result: 功返字元串度(般48)失敗返0
// pbrand: 接收商標信息字元串緩沖區至少49位元組
int cpu_getbrand(char* pbrand)
{
INT32 dwBuf[4];
if (NULL==pbrand) return 0;
// Function 0x80000000: Largest Extended Function Number
__cpuid(dwBuf, 0x80000000);
if (dwBuf[0] < 0x80000004) return 0;
// Function 80000002h,80000003h,80000004h: Processor Brand String
__cpuid((INT32*)&pbrand[0], 0x80000002); // 前16字元
__cpuid((INT32*)&pbrand[16], 0x80000003); // 間16字元
__cpuid((INT32*)&pbrand[32], 0x80000004); // 16字元
pbrand[48] = '\0';
return 48;
}
int _tmain(int argc, _TCHAR* argv[])
{
//__cpuidex(dwBuf, 0,0);
//__cpuid(dwBuf, 0);
//printf("%.8X\t%.8X\t%.8X\t%.8X\n", dwBuf[0],dwBuf[1],dwBuf[2],dwBuf[3]);
cpu_getvendor(szBuf);
printf("CPU Vendor:\t%s\n", szBuf);
cpu_getbrand(szBuf);
printf("CPU Name:\t%s\n", szBuf);
return 0;
}
六、兼容性說明
VC編譯器32/64位支持性——
32位:VC6早支持編譯32位Intrinsics函數
64位:VC2005早支持編譯64位Intrinsics函數
本文32位編譯器兼容性——
__cpuid:兼容VC6(或更高)
__cpuidex:兼容VC6(或更高)
本文64位編譯器兼容性——
__cpuid:兼容VC2005(或更高)
__cpuidex:兼容VC2011(或更高)
6. vc++編程時怎麼區分電腦是32位還是64位
按如下步驟操作橋唯就能看出來了。
右擊我的電腦。
選擇屬性。
結果如下圖,紅色框里就是你的電腦是32位巧野系統還是64位系統。
SYSTEM_INFOsi;
GetNativeSystemInfo(&si);
if(si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64||
si.wProcessorArchitecture!=PROCESSOR_ARCHITECTURE_IA64)
{
//64位操作系統
}
else
{
//32位操作系敏寬培統
}
7. vc判斷是32位編譯還是64位編譯判斷是debug編譯還是release編譯
1.判斷是debug編譯還是release編譯。
如果_DEBUG定義了表示是debug編譯,否則是release編譯粗螞。
2.判斷是32位編譯還是64位編譯。
在 Win32 配置下,_WIN32 有定義,_WIN64 沒有定義。在 x64 配置下,兩者都有定義。即在 VC 下,_WIN32 一定岩纖埋有定義。
因此,WIN32/_WIN32 可以用來判斷是否 Windows 系統(對於跨平台程序),而 _WIN64 用來判斷編譯環境是 x86 還是 x64。附一個表:
常量\定義 預定義選項 Windows.h VC編譯器
WIN32 Win32 √(minwindef.h) ×
_WIN32 × × √
_WIN64 × × x64
最後附上根據相應編譯情況,進行有條件的鏈接相應靜態庫的示例代碼,其實就是一些豎碼宏定義語句的使用:
[cpp] view plain在CODE上查看代碼片派生到我的代碼片
#include "json/json.h"
#ifdef _DEBUG
#ifndef _WIN64
#pragma comment(lib,"json/json_mtd.lib")
#else
#pragma comment(lib,"json/json_mtd_x64.lib")
#endif
#else
#ifndef _WIN64
#pragma comment(lib,"json/json_mt.lib")
#else
#pragma comment(lib,"json/json_mt_x64.lib")
#endif
#endif
using namespace Json;
8. tc和vc編譯機理不同嗎
編譯機理是一樣的,但是TC和VC之間,TC是十六位編譯器,VC是32位編譯器,在處理一些數據類型的時候會有差別。比如TC的int是16位,而VC的int是32位。
由於VC是Windows下的編譯器,所以編譯出來的目標文件按照Windows的規范來走,TC則按照DOS的規范來走。
兩者在編譯細搜老節上也有不同之處。
在孫中現在Windows時代,還是不世凱升要用TC了。