如何在命令行启用 64 位 Visual C++ 工具集Word文档格式.docx
《如何在命令行启用 64 位 Visual C++ 工具集Word文档格式.docx》由会员分享,可在线阅读,更多相关《如何在命令行启用 64 位 Visual C++ 工具集Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
允许您为Itanium创建输出文件。
x64onx86(x64跨平台编译器)
允许您为x64创建输出文件。
ItaniumonItanium
此版本的cl.exe在Itanium计算机上作为本机进程运行。
x64onx64
此版本的cl.exe在x64计算机上作为本机进程运行。
在64位Windows操作系统中安装64位编译器时,您将看到各种64位本机编译器和跨平台编译器的命令提示符。
若要访问这些命令提示符,请转至“开始”,再转至“所有程序”。
从“MicrosoftVisualStudio2005”菜单选项中选择“VisualStudio工具”,再选择命令提示。
Vcvarsall.bat
通过运行vcvarsall.bat批处理文件,可以在命令行中使用五个编译器中的任何一个。
默认情况下,此文件的完整路径为C:
\ProgramFiles\MicrosoftVisualStudio8\VC\Vcvarsall.bat。
(启用VisualC++工具集的另一种方法是使用vcvars32.bat,但这种方法仅启用32位编译器。
有关更多信息,请参见为命令行生成设置路径和环境变量。
)
如果没有提供任何参数,则此批处理文件将为使用x8632位编译器配置必要的环境变量,但此文件可用于配置任何64位编译器。
下表显示vcvarsall.bat支持的参数。
Vcvarsall.bat参数
编译器
主机(本机或使用仿真)
目标结构
“x86”(默认)
32位本机编译器
x86、x64、Itanium
x86
“x86_amd64”
x64跨平台编译器
X86、x64、Itanium
x64
“x86_IPF”
Itanium跨平台编译器
Itanium
“amd64”
x64本机编译器
“IPF”或“itanium”
Itanium本机编译器
请参见
概念
使用VisualC++进行64位编程
VisualC++概念:
生成C/C++程序
为命令行生成设置路径和环境变量
vcvars32.bat文件设置适当的环境变量以启用32位命令行编译。
有关如何在命令行启用64位工具集的更多信息,请参见如何:
在命令行启用64位VisualC++工具集。
注意如果是用DEVENV从命令行生成,除非也指定/useenv选项,否则vcvars32设置对生成无效。
运行vcvars32.bat
1.在命令提示下,更改到VisualC++安装的\bin子目录。
2.通过键入VCVARS32运行vcvars32.bat。
警告:
vcvars32.bat文件在不同的计算机中会有所不同。
不要用另一计算机中的vcvars32.bat替换缺少或损坏的vcvars32.bat文件。
重新运行VisualC++Setup以替换缺少的文件。
有关vcvars32.bat的更多信息,请参见下面的知识库文章:
∙Q248802:
Vcvars32.batGeneratesOutofEnvironmentMessage
如果安装VisualC++的当前版本的计算机上还有VisualC++的早期版本,则不应在同一个命令窗口中运行来自不同版本的vcvars32.bat。
CL.exe调用预处理器和编译器,而LINK.exe调用链接器。
(CL也可以调用链接器,因此多数情况下不必直接调用LINK。
)
CL.exe、LINK.exe和其他命令行工具要求适当地设置某些环境变量:
∙CL使用CL和INCLUDE。
∙LINK使用LINK、LIB、PATH和TMP。
在命令行上生成
链接
链接器选项
编译C/C++程序
编译器选项
VisualC++64位迁移的常见问题
用VisualC++创建在64位Windows操作系统中运行的应用程序时,应注意以下问题:
∙在64位Windows操作系统中,int和long是32位值。
对于计划为64位平台编译的程序,应注意不要将指针赋给32位变量。
在64位平台上,指针为64位,如果将该指针赋给32位变量,则应截断该指针值。
∙在64位Windows操作系统中,size_t、time_t和ptrdiff_t是64位值。
∙在32位Windows操作系统上VisualC++2005之前的VisualC++版本中,time_t是32位值。
在VisualC++2005和更高版本中,默认情况下,time_t是64位整数。
有关更多信息,请参见时间管理。
应注意代码在哪里采用int值并将其作为size_t或time_t值处理。
数字有可能增长得比32位数大,并且数据在被传递回int存储时有可能被截断。
%x(十六进制int格式)printf修饰符在64位Windows操作系统中不会按预期的那样工作。
它只对传递给它的值的前32位值执行操作。
∙Windows32位操作系统使用%I32x显示整数。
∙Windows64位操作系统使用%I64x显示整数。
∙%p(指针的十六进制格式)在64位Windows操作系统中按预期的那样工作。
有关更多信息,请参见:
∙编译器选项
∙/Wp64
∙__w64
∙MigrationTips
移植和升级程序
x64软件约定
本节描述用于x86结构的x6464位扩展的VisualC++调用约定方法。
∙x64调用约定概述
∙类型和存储
∙寄存器使用
∙调用约定
∙堆栈使用
∙保护现场和恢复现场
∙ExceptionHandlinginVisualC++
∙内部和内联程序集
∙图像格式
下面的编译器选项帮助您针对x64优化应用程序:
∙/favor(针对x64进行优化)
CallingConventions
VisualC++
x64调用约定概述
从x86到x64的两个重要修改是:
64位寻址功能和一组平面的用于常规使用的16个64位寄存器。
对于展开的寄存器集,x64仅使用__fastcall调用约定和基于RISC的异常处理模型。
__fastcall模型使用寄存器(对前四个变量)和堆栈帧传递其他参数。
以下编译器选项帮助您优化x64应用程序:
调用约定
x64应用程序二进制接口(ABI)是一个4寄存器快速调用调用约定,具有用于这些寄存器的堆栈后备功能。
函数中的参数与这些参数的寄存器之间有一对一的对应关系。
任何大于8个字节或不是1、2、4或8个字节的参数必须由引用传递。
不尝试将单个参数在多个寄存器间传播。
没有使用x87寄存器堆栈。
可以使用它,但是必须认为它在函数调用之间是易失性的。
所有浮点操作都是使用16个XMM寄存器完成的。
参数在寄存器RCX、RDX、R8和R9中传递。
如果参数是浮点/双精度型,则它们在XMM0L、XMM1L、XMM2L和XMM3L中传递。
16字节的参数由引用传递。
参数传递中详细描述了参数传递。
除这些寄存器外,RAX、R10、R11、XMM4和XMM5也是易失性的。
其他所有寄存器都是非易失性的。
寄存器使用和由调用方或被调用方保存的寄存器中详细记录了寄存器用法。
调用方负责为被调用方的参数分配空间,并且必须始终为4个寄存器参数分配足够的空间,即使被调用方没有这么多参数。
这有助于简化对C非原型函数和varargC/C++函数的支持。
对于vararg或非原型函数,任何浮点值都必须在相应的常规用途的寄存器中复制。
超过前4个的任何参数必须存储在堆栈上,位置在前4个的后备存储器之上,在调用之前。
Varargs中提供了Vararg函数的详细信息。
非原型函数中提供了关于非原型函数的详细信息。
对齐方式
大多数结构的对齐方式为自然对齐。
主要异常是堆栈指针和malloc或alloca内存,为了提高性能,它们的对齐方式为16字节对齐。
超过16字节的对齐必须手动完成,但由于16字节是XMM操作的常用对齐大小,所以对大多数代码应该足够了。
有关结构布局和对齐方式的更多信息,请参见类型和存储。
有关堆栈布局的信息,请参见堆栈使用。
展开性
必须使用数据[被称作xdata或ehdata,它被指出来源于pdata]批注所有非叶函数[这些函数既不调用函数,也不自己分配任何堆栈空间],该数据向操作系统描述如何正确展开这些函数以及恢复非易失性的寄存器。
Prolog和epilog受到严格限制,以便可在xdata中正确对它们进行描述。
在不属于epilog或prolog的任何代码部分中,堆栈指针的对齐方式必须为16字节对齐(叶函数除外)。
有关prolog和epilog函数的正确结构的详细信息,请参见保护现场和恢复现场。
有关异常处理和异常处理/展开pdata和xdata的更多信息,请参见异常处理(x64)。
类型和存储
本节描述x64结构的数据类型的枚举和存储。