本以为这些无关紧要的 Debug与Release以及x86、x64、Any CPU 差点搞死人了。
看了以下博文才后怕,难怪我切换了一下模式,程序就pass了。。。。
转载:
1.https://www.cnblogs.com/xxn-180727/p/9442992.html
2.https://www.cnblogs.com/netserver/p/11106130.html
一、Debug与Release
1. 区别
Debug——调试版,生成的.exe中包含很多调试信息,若直接发包,比较大;
Release——发布版
Debug编译有宏定义_DEBUG,若代码中定义了_DEBUG就表示是debug编译,否则是release
编译。
二、_WIN32与_WIN64
1. 定义
_WIN32是32位编译; _WIN64是64位编译。
之所以要分不同位数编译,最根本的目的就是提高软件的通用性,先了解几点常识:
- 如果电脑操作系统位数不同,那么代码中基本数据类型所占的字节也不同。
如:32位平台下long long是8个字节(64位),而64位平台下,long 是8个字节(64位)
- 64位操作系统理论上可以运行32位和64位软件,而32位操作系统只能运行32位的软件。
那么如何使软件在不同平台运行?方法就是宏定义:
Eg:# ifdef _WIN64
typedef long int int64_t;
# else
_extension_
typedef long long int int64_t;
2. 如何区分是32位编译还是64位编译
在 Win32 配置下,_WIN32 有定义,_WIN64 没有定义。在 x64 配置下,两者都有定义。
可以理解为32位不支持64位,而64位可以兼容32位。总之在 VC 下,_WIN32 一定有定义。
1 #ifdef _WIN64 // 说明是64位编译方式
2 typedef long long intptr_t;
3 #else
4 typedef _W64 int intptr_t;
5 #endif
Visual Studio中Debug与Release以及x86、x64、Any CPU的区别
Visual Studio中Debug与Release的区别:
在Visual Studio中,编译模式有2种:Debug与Release。这也是默认的两种方式,在新建一个project的时候,就已经存在这两种模式供选择。
Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
SO:
一般都是用Release来打包发布程序,因为Release做了更多的优化,运行速度更快,适合在项目完成后部署,另外,Release打包出来的程序文件也相对来说会小一些。而Debug模式更适合在开发调试的时候使用。即:开发调试的时候使用Debug模式,打包发布程序用Release模式。
Visual Studio中x86、x64、Any CPU的区别:
1、简单的说,它们之间最直接的区别就是:x86平台编译出来的exe(可执行文件)或dll(动态链接库)都是32位的。x64对应的则是64位的。而Any CPU则是取决于当前的操作系统,若操作系统是32位的,则编译出来的程序就是32位的,若操作系统是64位的,编译出来的就是64位程序。
2、若你的启动项目,即主程序(编译出来是exe文件的)是x86平台下编译的,而它所依赖的一个项目(或动态链接库)是由x64位平台编译出来的,则会提示“未能加载文件或程序集…或它的某一个依赖性。试图加载格式不正确的程序。”之类的错误。这是因为32位程序不能加载64位的dll,更不能调用其中的类、方法和对象等。
反之,若主程序是由x64平台编译出来的,而dll是x86的呢?答案。。也是不行的!
说到这里,基本上可以确定一点:dll和主程序的生成平台只要一致就可以。
那么问题来了!若主程序是Any CPU编译的,而dll是由x86或者x64平台编译的,又或者,主程序是x86或者x64平台编译的,而dll是由Any CPU编译的呢?正确答案就是两者在“特殊情况”下都是可行的。为什么说是“特殊情况”下呢?因为第一点也提到了,Any CPU取决于操作系统,而结合第二点提到的只要dll和主程序的生成平台一致,那么也是可行的。所以,由上可知:若主程序是在Any CPU平台下编译的,那么编译dll的平台必须要和编译主程序的操作系统一致才行。若主程序是在x86或者x64平台下编译的,那么dll就必须要和主程序一致。不过有个特例:若dll由Any CPU编译的,那么这个dll就可以被32位和64位的主程序调用。这是为什么呢?请看第三点。
3、虽说Any CPU编译出来的程序取决于操作系统,但是由Any CPU编译出来dll则取决于调用它的主程序,即若主程序是32位的,那么dll也是32位的,若主程序是64位的,那么dll就是64位的。所以dll一般采用Any CPU平台编译,而主程序(exe)一般采用x86平台编译。
总结:了解了它们的区别之后,我们打包程序的时候就知道如何取舍了。一般来说,在不清楚客户的电脑是什么类型的操作系统的情况下,或者两者都有的时候,则主程序采用x86平台编译,dll采用Any CPU平台编译。若清楚的知道是64位操作系统,那么就可以都按x64平台编译了。