收藏 分享(赏)

如何:在命令行启用 64 位 Visual C++ 工具集.doc

上传人:11xg27ws 文档编号:6356557 上传时间:2019-04-09 格式:DOC 页数:18 大小:270KB
下载 相关 举报
如何:在命令行启用 64 位 Visual C++ 工具集.doc_第1页
第1页 / 共18页
如何:在命令行启用 64 位 Visual C++ 工具集.doc_第2页
第2页 / 共18页
如何:在命令行启用 64 位 Visual C++ 工具集.doc_第3页
第3页 / 共18页
如何:在命令行启用 64 位 Visual C++ 工具集.doc_第4页
第4页 / 共18页
如何:在命令行启用 64 位 Visual C++ 工具集.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、如何:在命令行启用 64 位 Visual C+ 工具集请参见 发送反馈意见虽然默认情况下 Visual C+ 2005 不安装也不能用于所有版本(有关更多信息,请参见 Visual C+ 版本。),但使用其中包含的编译器却可以创建在 64 位 Windows 操作系统中运行的应用程序。 有关安装 64 位编译器的信息,请参见 安装 Visual Studio 64 位组件。有关在 Visual Studio 开发环境中创建 64 位应用程序的信息,请参见如何:针对 64 位平台配置 Visual C+ 项目。下面的列表描述了 cl.exe(Visual C+ 编译器)的各个版本:x86 on

2、 x86 允许您为 x86 计算机创建输出文件。此版本的 cl.exe 在 x86 计算机和 64 位 Widows 操作系统中的 WOW64 下作为 32 位本机进程运行。Itanium on x86(Itanium 跨平台编译器) 允许您为 Itanium 创建输出文件。此版本的 cl.exe 在 x86 计算机和 64 位 Widows 操作系统中的 WOW64 下作为 32 位本机进程运行。x64 on x86(x64 跨平台编译器) 允许您为 x64 创建输出文件。此版本的 cl.exe 在 x86 计算机和 64 位 Widows 操作系统中的 WOW64 下作为 32 位本机进程

3、运行。Itanium on Itanium 允许您为 Itanium 创建输出文件。此版本的 cl.exe 在 Itanium 计算机上作为本机进程运行。x64 on x64 允许您为 x64 创建输出文件。此版本的 cl.exe 在 x64 计算机上作为本机进程运行。在 64 位 Windows 操作系统中安装 64 位编译器时,您将看到各种 64 位本机编译器和跨平台编译器的命令提示符。若要访问这些命令提示符,请转至“开始”,再转至“所有程序”。从“Microsoft Visual Studio 2005”菜单选项中选择“Visual Studio 工具”,再选择命令提示。Vcvarsal

4、l.bat通过运行 vcvarsall.bat 批处理文件,可以在命令行中使用五个编译器中的任何一个。默认情况下,此文件的完整路径为 C:Program FilesMicrosoft Visual Studio 8VCVcvarsall.bat。(启用 Visual C+ 工具集的另一种方法是使用 vcvars32.bat,但这种方法仅启用 32 位编译器。有关更多信息,请参见 为命令行生成设置路径和环境变量。)如果没有提供任何参数,则此批处理文件将为使用 x86 32 位编译器配置必要的环境变量,但此文件可用于配置任何 64 位编译器。下表显示 vcvarsall.bat 支持的参数。Vcv

5、arsall.bat 参数编译器 主机(本机或使用仿真)目标结构“x86”(默认) 32 位本机编译器 x86、x64、Itaniumx86“x86_amd64” x64 跨平台编译器X86、 x64、Itaniumx64 “x86_IPF” Itanium 跨平台编译器X86、 x64、ItaniumItanium “amd64” x64 本机编译器 x64 x64 “IPF”或“itanium” Itanium 本机编译器Itanium Itanium 请参见概念使用 Visual C+ 进行 64 位编程Visual C+ 概念:生成 C/C+ 程序为命令行生成设置路径和环境变量请参见

6、发送反馈意见vcvars32.bat 文件设置适当的环境变量以启用 32 位命令行编译。有关如何在命令行启用 64 位工具集的更多信息,请参见 如何:在命令行启用 64 位 Visual C+ 工具集。注意如果是用 DEVENV 从命令行生成,除非也指定 /useenv 选项,否则 vcvars32 设置对生成无效。运行 vcvars32.bat1. 在命令提示下,更改到 Visual C+ 安装的 bin 子目录。2. 通过键入 VCVARS32 运行 vcvars32.bat。警告:vcvars32.bat 文件在不同的计算机中会有所不同。不要用另一计算机中的 vcvars32.bat 替

7、换缺少或损坏的 vcvars32.bat 文件。重新运行 Visual C+ Setup 以替换缺少的文件。有关 vcvars32.bat 的更多信息,请参见下面的知识库文章: Q248802 : Vcvars32.bat Generates Out of Environment Message如果安装 Visual C+ 的当前版本的计算机上还有 Visual C+ 的早期版本,则不应在同一个命令窗口中运行来自不同版本的 vcvars32.bat。CL.exe 调用预处理器和编译器,而 LINK.exe 调用链接器。 (CL 也可以调用链接器,因此多数情况下不必直接调用 LINK。 ) CL

8、.exe、LINK.exe 和其他命令行工具要求适当地设置某些环境变量: CL 使用 CL 和 INCLUDE。 LINK 使用 LINK、LIB、PATH 和 TMP。请参见概念在命令行上生成链接链接器选项编译 C/C+ 程序编译器选项Visual C+ 64 位迁移的常见问题请参见 发送反馈意见用 Visual C+ 创建在 64 位 Windows 操作系统中运行的应用程序时,应注意以下问题: 在 64 位 Windows 操作系统中,int 和 long 是 32 位值。对于计划为 64 位平台编译的程序,应注意不要将指针赋给 32 位变量。在 64 位平台上,指针为 64 位,如果将

9、该指针赋给 32 位变量,则应截断该指针值。 在 64 位 Windows 操作系统中,size_t、time_t 和 ptrdiff_t 是 64 位值。 在 32 位 Windows 操作系统上 Visual C+ 2005 之前的 Visual C+ 版本中,time_t 是 32 位值。在 Visual C+ 2005 和更高版本中,默认情况下,time_t 是 64 位整数。有关更多信息,请参见时间管理。应注意代码在哪里采用 int 值并将其作为 size_t 或 time_t 值处理。数字有可能增长得比 32 位数大,并且数据在被传递回 int 存储时有可能被截断。%x(十六进制

10、int 格式)printf 修饰符在 64 位 Windows 操作系统中不会按预期的那样工作。它只对传递给它的值的前 32 位值执行操作。 Windows 32 位操作系统使用 %I32x 显示整数。 Windows 64 位操作系统使用 %I64x 显示整数。 %p(指针的十六进制格式)在 64 位 Windows 操作系统中按预期的那样工作。有关更多信息,请参见: 编译器选项 /Wp64 _w64 Migration Tips 请参见概念使用 Visual C+ 进行 64 位编程移植和升级程序x64 软件约定请参见 发送反馈意见本节描述用于 x86 结构的 x64 64 位扩展的 Vi

11、sual C+ 调用约定方法。 x64 调用约定概述 类型和存储 寄存器使用 调用约定 堆栈使用 保护现场和恢复现场 Exception Handling in Visual C+ 内部和内联程序集 图像格式 下面的编译器选项帮助您针对 x64 优化应用程序: /favor(针对 x64 进行优化) 请参见概念Calling ConventionsVisual C+x64 调用约定概述请参见 发送反馈意见从 x86 到 x64 的两个重要修改是:64 位寻址功能和一组平面的用于常规使用的 16 个 64 位寄存器。对于展开的寄存器集,x64 仅使用 _fastcall 调用约定和基于 RISC

12、 的异常处理模型。_fastcall 模型使用寄存器(对前四个变量)和堆栈帧传递其他参数。以下编译器选项帮助您优化 x64 应用程序: /favor(针对 x64 进行优化) 调用约定x64 应用程序二进制接口 (ABI) 是一个 4 寄存器快速调用调用约定,具有用于这些寄存器的堆栈后备功能。函数中的参数与这些参数的寄存器之间有一对一的对应关系。任何大于 8 个字节或不是 1、2、4 或 8 个字节的参数必须由引用传递。不尝试将单个参数在多个寄存器间传播。没有使用 x87 寄存器堆栈。可以使用它,但是必须认为它在函数调用之间是易失性的。所有浮点操作都是使用 16 个 XMM 寄存器完成的。参数

13、在寄存器 RCX、RDX 、R8 和 R9 中传递。如果参数是浮点/双精度型,则它们在 XMM0L、XMM1L、XMM2L 和 XMM3L 中传递。16 字节的参数由引用传递。参数传递中详细描述了参数传递。除这些寄存器外,RAX、R10、R11、XMM4 和 XMM5 也是易失性的。其他所有寄存器都是非易失性的。寄存器使用和由调用方或被调用方保存的寄存器中详细记录了寄存器用法。调用方负责为被调用方的参数分配空间,并且必须始终为 4 个寄存器参数分配足够的空间,即使被调用方没有这么多参数。这有助于简化对 C 非原型函数和 vararg C/C+ 函数的支持。对于 vararg 或非原型函数,任何

14、浮点值都必须在相应的常规用途的寄存器中复制。超过前 4 个的任何参数必须存储在堆栈上,位置在前 4 个的后备存储器之上,在调用之前。Varargs 中提供了 Vararg 函数的详细信息。 非原型函数中提供了关于非原型函数的详细信息。对齐方式大多数结构的对齐方式为自然对齐。主要异常是堆栈指针和 malloc 或 alloca 内存,为了提高性能,它们的对齐方式为 16 字节对齐。超过 16 字节的对齐必须手动完成,但由于 16 字节是 XMM 操作的常用对齐大小,所以对大多数代码应该足够了。有关结构布局和对齐方式的更多信息,请参见类型和存储。有关堆栈布局的信息,请参见堆栈使用。展开性必须使用数

15、据被称作 xdata 或 ehdata,它被指出来源于 pdata批注所有非叶函数 这些函数既不调用函数,也不自己分配任何堆栈空间,该数据向操作系统描述如何正确展开这些函数以及恢复非易失性的寄存器。Prolog 和 epilog 受到严格限制,以便可在 xdata 中正确对它们进行描述。在不属于 epilog 或 prolog 的任何代码部分中,堆栈指针的对齐方式必须为 16 字节对齐(叶函数除外)。有关 prolog 和 epilog 函数的正确结构的详细信息,请参见保护现场和恢复现场。有关异常处理和异常处理/展开 pdata 和 xdata 的更多信息,请参见 异常处理 (x64)。请参见

16、概念x64 软件约定Visual C+类型和存储请参见 发送反馈意见本节描述 x64 结构的数据类型的枚举和存储。 标量类型 聚合和联合 结构对齐示例 位域 请参见概念x64 软件约定Visual C+标量类型请参见 发送反馈意见尽管可从任何对齐方式发出数据访问,但建议将数据在其自然边界上对齐,以避免性能损失(或更多损失)。枚举为常数整数,视为 32 位整数。下表介绍类型定义及其属于使用以下对齐值的对齐方式时的推荐存储区大小: Byte 8 位 Word 16 位 Double Word 32 位 Quad Word 64 位 Octa Word 128 位标量类型 C 数据类型 存储区大小(

17、以字节为单位)推荐对齐方式INT8 char 1 ByteUINT8 unsigned char 1 ByteINT16 short 2 WordUINT16 unsigned short 2 WordINT32 int、long 4 DoublewordUINT32 unsigned int、unsigned long 4 DoublewordINT64 _int64 8 QuadwordUINT64 unsigned _int64 8 QuadwordFP32(单精度) float 4 DoublewordFP64(双精度) double 8 QuadwordPOINTER * 8 Qua

18、dword_m64 struct _m64 8 Quadword_m128 struct _m128 16 Octaword请参见Visual C+聚合和联合请参见 发送反馈意见其他类型(如数组、结构和联合)都具有较严格的对齐要求,以确保对聚合和联合实现一致的存储与数据检索。以下是数组、结构和联合的定义:数组 包含相邻数据对象的有序组。每个对象称为一个元素。数组中所有元素的大小和数据类型都相同。结构 包含数据对象的有序组。与数组的元素不同,结构中的数据对象可以具有不同的数据类型和大小。结构中的每个数据对象称为一个成员。联合 可保存任何命名成员集的对象。命名集的成员可以是任何类型。为联合分配的存

19、储区等于该联合的最大成员所需的存储区,再加上对齐所需的所有空白。下表所示为强烈建议的联合和结构标量成员的对齐方式。 标量类型 C 数据类型 要求的对齐方式INT8 char ByteUINT8 unsigned char ByteINT16 short WordUINT16 unsigned short WordINT32 int、long DoublewordUINT32 unsigned int、unsigned long DoublewordINT64 _int64 QuadwordUINT64 unsigned _int64 QuadwordFP32(单精度)float Doublew

20、ordFP64(双精度)double QuadwordPOINTER * Quadword_m64 struct _m64 Quadword_m128 struct _m128 Octaword适用以下聚合对齐规则: 数组的对齐方式与数组中某个元素的对齐方式相同。 结构或联合开始处的对齐方式是所有单个成员的最大对齐方式。结构或联合中的每个成员必须位于其正确的对齐位置,如前面表中所定义的那样,而这可能需要进行隐式内部填充(由前面的成员决定)。 结构大小必须是其对齐的整数倍,这可能需要在最后一个成员之后进行填充。由于结构和联合能以数组进行分组,因此结构或联合的每个数组元素必须按照前面定义的正确对齐

21、方式开始和结束。 只要遵循前面的规则,就可以使用超出对齐要求的方式将数据对齐。 由于大小方面的原因,单个编译器可能会调整结构的封装方式。例如,/Zp(结构成员对齐)就允许调整结构的封装方式。请参见概念类型和存储发送反馈意见,就此主题向 Microsoft位域构位域限制为 64 位,可以是有符号整数、无符号整数、int64 或无符号 int64。跨越类型边界的位域将跳过位,以使位域与下一个类型对齐方式对齐。例如,整数位域可能不能跨越 32 位边界。Visual C+寄存器使用请参见 发送反馈意见x64 结构提供了 16 个通用寄存器(以后称为整数寄存器),以及 16 个可供浮点使用的 XMM 寄

22、存器。易失寄存器是由调用方假想的临时寄存器,并要在调用过程中销毁。非易失寄存器需要在整个函数调用过程中保留其值,并且一旦使用,则必须由被调用方保存。下表说明了每种寄存器在整个函数调用过程中的使用方法:Register 状态 请使用RAX 易失的 返回值寄存器 RCX 易失的 第一个整型参数 RDX 易失的 第二个整型参数 R8 易失的 第三个整型参数 R9 易失的 第四个整型参数 R10:R11 易失的 必须根据需要由调用方保留;在 syscall/sysret 指令中使用 R12:R15 非易失的 必须由被调用方保留 RDI 非易失的 必须由被调用方保留 RSI 非易失的 必须由被调用方保留

23、 RBX 非易失的 必须由被调用方保留 RBP 非易失的 可用作帧指针;必须由被调用方保留 RSP 非易失的 堆栈指针 XMM0 易失的 第一个 FP 参数 XMM1 易失的 第二个 FP 参数 XMM2 易失的 第三个 FP 参数 XMM3 易失的 第四个 FP 参数 XMM4:XMM5 易失的 必须根据需要由调用方保留 XMM6:XMM15 非易失的 必须根据需要由被调用方保留。 请参见Visual C+堆栈使用Visual C+堆栈分配请参见 发送反馈意见函数的 Prolog 负责为局部变量、保存的寄存器、堆栈参数和寄存器参数分配堆栈空间。参数区通常位于堆栈底部(即使使用了 alloca

24、),因此在任何函数调用期间,参数区通常与返回地址相邻。该区域至少包含四项,但通常有足够的空间来保存可能调用的任何函数所需的所有参数。请注意,即使寄存器参数本身始终不对堆栈进行寻址,也会始终为这些参数分配空间;保证为被调用方的所有参数分配空间。寄存器参数要求内部地址,这样,如果被调用的函数需要获得参数列表 (va_list) 或单个参数的地址,就会有可用的连续区域。此区域还提供了一个方便的位置,用于在 thunk 执行期间保存寄存器参数,并可作为一个调试选项(例如,如果参数存储在其 Prolog 代码的内部地址,则在调试期间便易于查找)。即使被调用函数的参数少于 4 个,该函数实际上也占有这 4

25、 个堆栈位置,并可将这几个位置用于保存参数寄存器值以外的其他目的。因此,在整个函数调用过程中,调用方不会将信息保存在此堆栈区域中。如果在函数中动态分配 (alloca) 空间,则必须将非易失寄存器作为帧指针使用,以标记堆栈的固定部分的基址,并且必须在 Prolog 中对该寄存器进行保存和初始化。请注意,使用 alloca 时,如果同一个调用方对同一个被调用方进行调用,则寄存器参数可能会有不同的内部地址。堆栈将始终保持 16 字节对齐,以下两种情况除外:一是在 Prolog 中(例如,推入返回地址之后);二是在帧函数特定类的函数类型中指示的位置。下面是一个堆栈布局的示例,其中函数 A 调用一个非

26、叶函数 B。函数 A 的 Prolog 已在栈底为 B 需要的所有寄存器参数和堆栈参数分配了空间。该调用将返回地址压栈,而 B 的 Prolog 为其局部变量、非易失寄存器分配空间,并为其分配调用函数所需的空间。如果 B 使用 alloca,则在局部变量/非易失寄存器保存区与参数堆栈区之间进行空间分配。 当函数 B 调用另一个函数时,正好将返回地址推入 RCX 内部地址的下方。Visual C+函数类型请参见 发送反馈意见基本上有两种函数类型。需要堆栈帧的函数称为帧函数。不需要堆栈帧的函数称为叶函数。帧函数是分配堆栈空间、调用其他函数、保存非易失寄存器或使用异常处理的函数。它还要求有一个函数表

27、项。帧函数需要有 Prolog 和 Epilog。帧函数可以动态分配堆栈空间并采用帧指针。帧函数可以全权处理此调用标准的所有功能。如果帧函数不调用另一个函数,那么就不需要用它来对齐堆栈(请参考堆栈分配一节)。叶函数不需要函数表项。它不能调用任何函数,不能分配空间,也不能保存任何非易失寄存器。执行叶函数时,允许不对齐堆栈Visual C+malloc 对齐请参见 发送反馈意见malloc 是返回 16 字节边界内存所必需的。Allocates memory blocks.void *malloc(size_t size );Parameterssize Bytes to allocate.Ret

28、urn Valuemalloc returns a void pointer to the allocated space or NULL if there is insufficient memory available. To return a pointer to a type other than void, use a type cast on the return value. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of an

29、y type of object. If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return from malloc, even if the amount of memory requested is small.RemarksThe malloc function allocates a memory block of at least size bytes. The block may be

30、larger than size bytes because of space required for alignment and maintenance information.In Visual C+ 2005, malloc sets errno to ENOMEM if a memory allocation fails or if the amount of memory requested exceeds _HEAP_MAXREQ. For information on this and other error codes, see errno, _doserrno, _sys_

31、errlist, and _sys_nerr.The startup code uses malloc to allocate storage for the _environ, envp, and argv variables. The following functions and their wide-character counterparts also call malloc:calloc fscanf _getw setvbuf_exec functions fseek _popen _spawn functionsfgetc fsetpos printf _strdup_fget

32、char _fullpath putc systemfgets fwrite putchar _tempnamfprintf getc _putenv ungetcfputc getchar puts vfprintf_fputchar _getcwd _putw vprintffputs _getdcwd scanf fread gets _searchenv The C+ _set_new_mode function sets the new handler mode for malloc. The new handler mode indicates whether, on failur

33、e, malloc is to call the new handler routine as set by _set_new_handler. By default, malloc does not call the new handler routine on failure to allocate memory. You can override this default behavior so that, when malloc fails to allocate memory, malloc calls the new handler routine in the same way

34、that the new operator does when it fails for the same reason. To override the default, call Copy Code_set_new_mode(1)early in your program, or link with NEWMODE.OBJ (see Link Options).When the application is linked with a debug version of the C run-time libraries, malloc resolves to _malloc_dbg. For

35、 more information about how the heap is managed during the debugging process, see The CRT Debug Heap.malloc is marked _declspec(noalias) and _declspec(restrict), meaning that the function is guaranteed not to modify global variables, and that the pointer returned is not aliased. For more information

36、, see noalias and restrict.RequirementsRoutine Required headermalloc and For additional compatibility information, see Compatibility in the Introduction.LibrariesAll versions of the C run-time libraries.ExampleCopy Code/ crt_malloc.c/ This program allocates memory with/ malloc, then frees the memory

37、 with free.#include / For _MAX_PATH definition#include #include int main( void )char *string;/ Allocate space for a path namestring = malloc( _MAX_PATH );/ In a C+ file, explicitly cast mallocs return. For example, / string = (char *)malloc( _MAX_PATH );if( string = NULL )printf( “Insufficient memory availablen“ );elseprintf( “Memory space allocated for path namen“ );free( string );printf( “Memory freedn“ );Copy CodeMemory space allocated for path nameMemory freed

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报