在之前的版本上改了很多功能之后,一直用的Debug版本在本地调试,没有什么问题。今天给同事提供了老版本和新版本的Release的EXE程序,结果反馈新版本的程序运行不了。
缘由
按照惯例,肯定是没安装redist_x86.exe环境,转念一想我们打包可是自带了msvcrt.dll等CRT库的,况且测试环境可是同时在测试两个版本的,老版本可以正常运行的,为啥新版本有问题呢,话说新版本也只是修改之前的逻辑而已,并没有任何新增第三方库依赖抑或是编译配置上的改变,或者是lib库文件的变化,而且也不是程序运行起来之后崩溃的。
尝试
看来事情并没有那么简单,自己测试一下,果然是无法定位到一个第三方的dll中。好吧,先不管什么原因了,反正就一个dll的问题,首先确认Debug版本和Release版本是正确编译且正确的链接了对应版本,然后直接源码编译了下第三方库,顺便做成静态库再链接。BUT,再运行又报另外一个第三方dll无法定位到,到这我的内心是崩溃的,VS你都干了啥!
解决
既然不是自身问题,那么还是求助网络。按照网上的解释,修改Release版本配置的优化链接的引用
,也就是在编译器优化的时候,如果不需要某些函数,链接的时候就丢弃掉,可以大大减少生成文件的体积。当然这是个不错的优化,但是为什么明明被引用的函数也被优化了呢,之前怎么没优化掉,无法解释。只好将该选项修改为/OPT:NOREF
。
图就不放了,修改位置为项目属性
-> 配置Release
-> 链接器
-> 优化
-> 引用
。
思考
虽然说这么配置就解决了问题,但这算不算是编译器的BUG呢。