C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C/C++基础与进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_2276111.html 最近因为项目要将软件从32位升级到64位,之前没有64位软件开发编译经历,所以大概地研究了一下。本文分享一下如何在Visual Studio 2017 中配置x64编译环境以及如何使用命令行脚本去编译x64下的代码。
1、新建x64解决方案平台
如果当前解决方案中的多个项目都没有配置过x64平台,则在Visual Studio主界面的解决方案栏中,只能看到x86(32位选项),看不到x64选项,如下所示:
这时就需要去新建x64平台选项。
点击Visual Studio的工具栏中平台选项组合框,在弹出的下拉框中,点击“配置管理器”,在打开的配置管理器窗口中,点击“活动解决方案平台”组合框,在弹出的下拉框中点击“新建”:
然后在弹出的新建解决方案平台窗口中,选择x64平台:
从此处复制设置选项,使用默认的即可;勾选上“创建新的项目平台”,点击确定即可。
这样在Visual Studio的工具栏中就可以看到x64选项了:
如果解决方案中有项目配置了x64编译选项,则在Visual Studio的工具栏中就直接能看到x64选项,就不用再新建了。
2、新建工程的x64编译选项
创建x64平台之后,是不是就能立即在64位下编译代码了呢?直接在Visual Studio的工具栏中选择x64,然后编译某个工程,可能会看到:
查看输出窗口中的输出,看到依然是编译Debug Win32,即还是编译32位版本的。所以此时还需要给解决方案中的工程配置x64编译选项。
点击Visual Studio的工具栏中平台选项组合框,在弹出的下拉框中,点击“配置管理器”,打开配置管理器窗口,窗口中显示解决方案中的所有工程:
先在最上面选择平台为x64,然后点击工程所在行的平台,然后点击新建,弹出如下的新建窗口:
先选择平台为x64,从此处复制设置项使用默认,然后不要勾选“创建新的解决方案平台”(因为解决方案平台x64已经创建),点击确定即可。
这样,工程的平台下拉框中就有Win32和x64两个选项。配置好后,在.vcxproj工程文件中就会增加对应的配置项,如下:
注意上方解决方案Debug下的x64,要和工程中的Debug和x64要一致:
具体工程的x64编译选项设置好后,再发起编译,就能编译对应版本了:
在这里,给大家**重点推荐一下我的几个热门畅销专栏,欢迎订阅:**(博客主页还有其他专栏,可以去查看)
专栏1:(该精品技术专栏的订阅量已达到430多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)
C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931
本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!
考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!
专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!
**专栏2: **
C/C++基础与进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html
以多年的开发实战经验为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对C++相关知识点进行详细地展开与剖析!专栏涉及了C/C++开发领域多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!
**专栏3: **
VC++常用功能开发汇总https://blog.csdn.net/chenlycly/article/details/124272585
专栏将10多年C++开发实践中常用的功能,以高质量的代码展现出来,并对相关功能的实现细节进行了详细的说明。这些常用的代码,其质量与稳定性是有保证的,可以直接拿过去使用,可以有效地解决C++软件开发过程中遇到的问题。
3、检查工程属性中的配置项是否需要修改或同步
工程属性中的配置项一般会在配置工程的x64选项时,自动从Win32设置中拷贝过来。此处需要检查一下这些配置是否都自动同步过来,有些路径可能需要修改(主要是和32位路径区分开来)。
1)中间文件和目标文件存放路径配置
首先,中间文件路径和目标二进制文件存放路径,要和32位版本区分开来,将路径修改成带_x64后缀的:
2)附加包含路径配置
到 C/C++ -> 常规中检查“ 附加包含路径”配置:
可能会涉及到有别于32位的路径调整。
3)预定义宏配置
到 C/C++ -> 预处理器 中检查“预处理器定义”配置:
4)附加库路径配置
到 链接器 -> 常规 中检查“附加库路径”配置:
可能会涉及到有别于32位的路径调整。
5)生成后事件配置
到 生成事件 -> 生成后事件 中检查“生成后事件”配置:
可能会涉及到有别于32位的路径调整。
4、x64和Win32下的部分配置可能不一致,会导致Win32下可以正常编译的代码到x64下会编译错误
在工程属性配置中,切换到x64后可能使用的当前Visual Studio版本的默认配置,而很多工程是从低版本的Visual Studio升级上来的,是没有新版本Visual Studio的默认配置的。因此可能会导致x64和Win32下的部分配置不一致的情况,可能会导致Win32下可以正常编译的代码到x64下会编译会报错。我们在实际操作时就遇到两类典型场景。
4.1、error C2760: 语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符”
将32位升级到64位后,遇到这样的编译错误:
在头文件中用typedef关键字将一个vector列表类型重新定义成一个新的类型Receiversvector,如下:
然后在cpp中使用这个新的类型Receiversvector去定义变量时报错了。但这个代码,看上去好像是没问题的。
到网上查了“error C2760: 语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符””这个错误类型的相关含义,这个错误通常发生在缺少类型说明符的情况下,或者在错误的位置使用了标识符。后来经过搜索发现,**可能是工程配置中开启了符合模式导致的**,具体的设置入口为:**C/C++->语言->符合模式**,如下所示:
这个符合模式对应的编译选项为/permissive-,用来指定编译器的标准符合性模式。该选项使用当前编译器版本中的符合性支持来确定哪些语言构造不符合要求。使用此选项可帮助你识别并修复代码中的符合性问题,使其更正确且更易移植。为了快速解决问题,将符合模式关闭即可。
4.2、error C4996: ‘inet_addr‘: Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WAR
将32位升级到64位后,原本在32位下能正常编译的代码,到64位下编译出现了很多错误。其中一个错误如下所示:
error C4996: ‘inet_addr‘: Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WAR
不能使用inet_addr系统函数,应该使用inet_pton函数。代码在32位下编译是没问题的,为啥到64位下就出问题呢?
先是看了inet_addr和inet_pton这两个函数的说明:
inet_addr是将IPv4点进制的IP字符串(比如172.16.88.88)转换成整型数值的地址。
inet_pton是Windows系统新增的接口,不仅可以转换IPv4地址(比如172.16.88.88),还可以转换IPv6地址(比如2001:0DB8:0:CD30:123:4567:89AB:CDEF),将字符串地址转换成整型数值地址。
**目前我们代码中使用的IPv4地址,使用inet_addr函数就可以了,为啥编译器要强制我们使用inet_pton将inet_addr替换掉呢?**经搜索发现,在VS2013以后的版本中,增加了inet_pton(窄字节版本)、InetPton(宽字节版本)之类的新函数,用于IP地址在“点分十进制”和“二进制整数”之间转换,并且能够处理ipv4和ipv6。而inet_addr是老函数,高版本VS在编译时默认使用了新函数,所以会报该错误。
为啥32位下编译没问题,64位下编译会有问题呢?是因为64位将SDL检查选项打开了:(C/C++->常规->SDL检查):
这个SDL检查对应的编译选项为/sdl,这是安全开发生命周期(SDL)建议的检查,包括启用其他安全代码生成功能并启用额外的安全相关警告作为错误。
这个/sdl编译选项,在32位下是关闭的,所以32位下编译没有报错。
解决办法是,C/C++->常规->SDL检查路径下,将SDL检查选项关闭掉即可。
5、在.bat编译脚本中编译x64版本
对于自动化编译系统,一般是通过编译脚本去执行代码编译的。在Windows系统中,则主要.bat批处理脚本去处理的。
那如何在.bat批处理脚本中去编译x64版本呢?主要是控制Visual Studio的exe程序devnev.exe去编译。
我们无论在编译Win32还是x64,需要先执行Visual Studio安装目录下用于初始化上下文编译环境的脚本vcvars32.bat或者vcvars64.bat。
以我的工作PC为例,在我的Visual Studio安装路径C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build下,可以看到用于初始化上下文编译环境的脚本vcvars32.bat和vcvars64.bat:
我们在编译x64版本时,需要先调用vcvars64.bat去初始化x64的编译环境。
为了方便多个脚本使用,可以把上述路径添加到环境变量中:
VS2017:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
如下所示:
这样,我们在.bat批处理文件中,先调用批处理vcvars64.bat去初始化x64的编译环境,然后使用devnev去编译工程文件,相关脚本如下所示:
call "%VS2017%\vcvars64.bat"
devenv sqlite.vcxproj /rebuild "Release|x64" /OUT compileinfo_sqlite.txt
编译的是Release下的64位版本,所以传入"Release|x64"参数。
6、最后
本文根据近期将32位程序升级到64位的项目实践,大概地总结了一些配置x64编译环境的方法,以及一些编译问题的解决办法,希望能给大家提供一个借鉴或参考。
版权归原作者 dvlinker 所有, 如有侵权,请联系我们删除。