当前位置:首页 » 编程软件 » vc编译32位

vc编译32位

发布时间: 2023-03-18 13:38:20

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位

按如下步骤操作桥唯就能看出来了。

  1. 右击我的电脑。

  2. 选择属性。

结果如下图,红色框里就是你的电脑是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了。

热点内容
研究生复试需要什么配置的电脑 发布:2025-07-19 15:42:21 浏览:963
python文字 发布:2025-07-19 15:38:43 浏览:828
php办公系统 发布:2025-07-19 03:06:35 浏览:900
奥德赛买什么配置出去改装 发布:2025-07-19 02:53:18 浏览:42
请与网络管理员联系请求访问权限 发布:2025-07-19 02:37:34 浏览:189
ipad上b站缓存视频怎么下载 发布:2025-07-19 02:32:17 浏览:844
phpcgi与phpfpm 发布:2025-07-19 02:05:19 浏览:527
捷达方向机安全登录密码是多少 发布:2025-07-19 00:57:37 浏览:694
夜魔迅雷下载ftp 发布:2025-07-19 00:39:29 浏览:99
增值税票安全接入服务器地址 发布:2025-07-19 00:20:45 浏览:486