开发中编译选项的选择

  在实际开发中经常遇到这种问题,程序在开发者电脑中测试完成,但拷贝到用户电脑时经常无法正常打开。报错诸如“程序版本不兼容”、“缺少xxx.dll”、“应用程序无法正常启动”等等各种错误,本文主要讨论一下几种常见错误的原因与解决办法。
  通过实际例程对问题进行展示,开发环境为Win10+VS2019,测试环境为Win7 32位系统和Win7 64位系统(系统中未安装运行时库),程序功能为向控制台输出“Hello”字符串。程序代码如下:
在这里插入图片描述


在程序开发中需要对程序版本及编译选项进行设定,如以下几个关键因素:
1.开发平台:X86,X64。
开发平台的选择决定了程序运行在那种平台环境下,一般情况下,电脑系统为32位,可运行X86程序,不可运行X64程序。电脑系统为64位,可运行X86和X64程序。选择方式如下图:
在这里插入图片描述

2.编译版本:Debug,Release。
Debug:调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release: 发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
两个版本的区别表现在是否包含调试信息以及是否对代码进行优化,在实际开发中,都是先使用Debug版进行调试,发现错误更正再调试,当程序运行稳定后再发行Release版。选择方式如下图:
在这里插入图片描述

3.编译选项(运行库的选择):MT,MTd,MD,MDd。
编译选项包含多个参数,本文主要介绍一下对运行时库(Runtime Library)链接的设定。
MT:MutiThread,多线程库(静态库),编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即链接LIBCMT.lib库
MTd:MutiThread+debug,多线程调试版(静态库),连接LIBMITD.lib库
MD: MT+DLL,多线程动态库,连接MSVCRT.lib库,这是个导入库,对应动态库为MSVCRT.dll
MDd:MT+DLL+debug,多线程动态调试库,连接MSVCRTD.lib库,对应动态库为MSVCRTD.dll

编译选项的设定在工程属性->C/C+±>运行库,可分别选择以上选项。
在这里插入图片描述


  经过以上三类参数的选择,共可以组成16种组合,但运行时库的在设定时分为调试版和非调试版,根据上文讲的两者的区别,故在16种组合中会出现不合理的匹配,如调试版程序链接非调试版运行库,或发布版程序链接调试版运行库。这样可能导致不必要的错误,因此这种错误设定本文不做讨论。
所以最终会生成8种类型的程序,如下图:
在这里插入图片描述
从图中应用程序大小可以总结几个特点:
1.X64平台版本比同等编译条件下的X86平台版本文件体积大。原因为程序内部变量、指针等需适用不同字长的系统,64位版相对占用较大。
2.Debug版本比同等编译条件下的Release版本文件体积大。原因为Debug版程序包含部分调试信息,且未进行代码优化。
3.静态库版本(MT、MTd)比同等编译条件下的动态库版本(MD、MDd)文件体积大。原因为静态库版本是将运行时库的代码直接编译进可执行文件,而动态库版本程序只在运行时调用所需的动态运行时库,这是本文需要重点讨论的问题。


下面将以上8个程序分别放到不同环境中测试,将报错的程序总结如下,其他版本程序可正常运行。

Win7 32位系统:
正常程序(X86_Debug_MTd,X86_Release_MT,X86_Release_MD)
在这里插入图片描述
缺少动态链接库(X86_Debug_MDd)
在这里插入图片描述

  作为程序用户,为了解决这种情况可在网上下载相应动态链接库,且动态链接库本身也分X86和X64版本,将正确版本的动态库放到程序目录下(或者系统环境变量目录下)即可正常运行程序。在测试中当放入错误版本的动态链接库时(X86程序放入X64动态库),可能报以下错误:
在这里插入图片描述
程序版本不兼容(X64_Debug_MDd,X64_Debug_MTd,X64_Release_MD,X64_Release_MT)
在这里插入图片描述
以上4个程序不能正常运行,需在64位操作系统下使用。

Win7 64位系统:
正常程序(X86_Debug_MTd,X86_Release_MT,X86_Release_MD,X64_Debug_MTd,X64_Release_MT,X64_Release_MD)
在这里插入图片描述
缺少动态链接库(X86_Debug_MDd,X64_Debug_MDd)
在这里插入图片描述
在这里插入图片描述
这两种情况报错类似,其中X64版程序多调用了一个动态链接库,解决方法为放入相应版本(X86平台程序使用32位动态库,X64平台程序使用64位动态库)的动态链接库文件即可,但若将错误版本放入,则会报如下错误:
在这里插入图片描述
在这里插入图片描述
因此在使用中遇到此类错误可检查下动态链接库的版本问题。


以上就是程序在不同系统环境中的运行情况,根据以上测试结果,归纳总结如下:
1.不同平台的程序应运行在对应版本的操作系统下,其中64位系统可兼容32位程序(并非绝对兼容),但使用64位程序可达到更好的运行效果。
2.平台正确情况下,只有Debug版本且使用动态链接运行库的程序会报错,需放入正确版本的动态链接库。其他版本都可正确运行。

  因此在实际项目中建议,当程序测试完成后,交付用户的程序尽量使用发布版,此时运行时库对程序运行不再造成影响,该版本还具有两个的优点:
1.程序体积小,便于发布。
2.编译时进行了代码优化,执行效率更高。

以上是有关“开发中编译选项”的讨论,观点中可能存在错误,欢迎在文末留言讨论。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值