VC的Release版本无法找到入口问题

在之前的版本上改了很多功能之后,一直用的Debug版本在本地调试,没有什么问题。今天给同事提供了老版本和新版本的Release的EXE程序,结果反馈新版本的程序运行不了。

缘由

按照惯例,肯定是没安装redist_x86.exe环境,转念一想我们打包可是自带了msvcrt.dll等CRT库的,况且测试环境可是同时在测试两个版本的,老版本可以正常运行的,为啥新版本有问题呢,话说新版本也只是修改之前的逻辑而已,并没有任何新增第三方库依赖抑或是编译配置上的改变,或者是lib库文件的变化,而且也不是程序运行起来之后崩溃的。

尝试

看来事情并没有那么简单,自己测试一下,果然是无法定位到一个第三方的dll中。好吧,先不管什么原因了,反正就一个dll的问题,首先确认Debug版本和Release版本是正确编译且正确的链接了对应版本,然后直接源码编译了下第三方库,顺便做成静态库再链接。BUT,再运行又报另外一个第三方dll无法定位到,到这我的内心是崩溃的,VS你都干了啥!

解决

既然不是自身问题,那么还是求助网络。按照网上的解释,修改Release版本配置的优化链接的引用,也就是在编译器优化的时候,如果不需要某些函数,链接的时候就丢弃掉,可以大大减少生成文件的体积。当然这是个不错的优化,但是为什么明明被引用的函数也被优化了呢,之前怎么没优化掉,无法解释。只好将该选项修改为/OPT:NOREF

图就不放了,修改位置为项目属性 -> 配置Release -> 链接器 -> 优化 -> 引用

思考

虽然说这么配置就解决了问题,但这算不算是编译器的BUG呢。

最近的文章

SetConsoleCtrlHandler实现资源释放

今天决定对程序产生的不完整的临时文件进行下优化,当然这些临时文件是非预期的,在程序中都进行了处理,但是在某些情况下确实是发生了。 现象分析首先可以确认的是这些临时文件都是程序在退出时候未处理生成的。当然程序全部是正常退出的,并没有异常崩溃,但是退出的方法有多种,比如Ctrl+C按键,比如直接点击控制 …

技术 继续阅读
更早的文章

ffmpeg视频解码丢帧问题

视频解码的时候,av_read_frame出来的包进行avcodec_decode_video2解码,有时候got_frame为0,即没有数据。一般来讲每一帧都是一帧图像,按道理肯定是有图像的,但却没有,依此下去最终在文件结尾处依然是少部分数据,难不成数据丢了? …

技术 继续阅读