事情是这样的,long long ago,我搞了一个工程,里面用了很多库,基本情况是这样的:
核心是saga和gdal,而saga又用到了wxWidgets,gdal,opencv,proj,geotrans,vigra,本身我也用gdal,另外gdal还用到了hdf4,hdf5,hdfeos,其余库,比如libpng,libjpeg,libzip,libszip,libpq等一大堆,看这么多库也就知道这个工程搞的多么不容易。后来xp实在用的不爽了,重装Win7,考虑到所有这些库我都能编译,于是就没有备份,于是就有了后面的事情!!!!那就是本大爷花了整整2天,重新部署这些环境....悲催的事情是各种库都编译好了,工程也编译通过了,可是程序就是启动不了,错误消息框提示"应用程序无法正常启动(0xc0150002)。"
百度了下,发现很多地方都说是运行时错误,也有地方说要把工程属性改成“多线程调试”,没有确切的答案。无奈,DEPENDS看了下,发现自己的exe里面确实是依赖了不同版本的运行时,有msvcr80,msvcr90,msvcr10,于是本大爷再次大刀阔斧的干了一场,就用VS2009把所有的库都编译了一遍,并且编译选项都设置成一样的,这又花了1天,最后的成果就是exe里面只依赖了vc90的dll,这下该干净了吧?悲催的事情还是继续,问题依旧,就是不干!最后各种郁闷抓狂,我都要问候微软全家了。冷静下来之后,想一下,自己用了这么多库,是不是库之间有问题?于是不断实验,新建了一个工程,把原工程的代码按照使用到的库一点一点往进放,这个事情有点像牛顿实验各种材料是不是适合做灯丝一样,各种代码和库一点一点放进去,最后全部放完了,新的工程没问题,正确编译,并且可以启动,测试代码也都正确执行了,没有任何问题!这下不仅又要忍不住想问候微软了,最后新的工程和旧的工程基本完全一样,一个编译了不能启动,另一个编译了却能正常运行,这个事情真是跟见了鬼一样!但问题总有个原因,没有原因,就不科学!研究了下,最后才发现,新建的工程没有使用vld检测内存泄漏,于是我给新的工程也加入了vld,开心的事情终于发生了,我再次遇到了“应用程序无法正常启动(0xc0150002)”的错误提示!好了,问题找到了,看来我是错怪微软了,问候了那么多次,看来都是冤的呀!
那么问题就是这样的,工程里加入了vld,程序就无法正常启动了,这也不科学呀!之前一直都在用呀。于是看了下自己的藏品,发现vld的版本有很多,我用的是vld2.2,换成了2.3,问题依旧,最后换上了低版本的vld1.0,发现可以用了。那么问题就明朗了,看来Win7下,使用vld1.0以上版本,会有危险呀!回头再想想,其实exe依赖多种版本的c++运行时也不是真么奇怪的事情,以前的程序不也是用到了很多库吗,各种库也没有全部都用同一版本的vs编译呀!看来度娘真是误事呀!
上面就是全部故事,鉴于这个事情整整耗了本大爷的五天时间,各种抓狂不爽,于是打破纪录,决定写下这篇,以期他人不要重蹈覆辙!