作者:朱金灿

来源:http://blog.csdn.net/clever101

今天同事在Windows XP系统上运行程序遇到这样一个错误:

我试了一下,在Win7上运行则没有这个错误。只是程序运行出错,代码编译是没有问题的。初步分析了一下,大致明白了问题了根源。问题的根源在于程序的exe或者其底层库链接了一个错误的msvcrt.dll。其实微软提供的VC运行时库是有很多版本的。为什么需要这么多的运行时库?原因很多,主要有下面两个:一是为了不同的处理器厂商和硬件架构,比如amd和intel,比如x86和x64等等;二是为了适配不同VS版本,比如VS2003、VS2005、VS2008等等,即使同是VS2008,VS2008和VS2008+sp1的运行时库都是不一样的。因此msvcrt.dll在xp系统和win7系统都是不一样的,具体到这个错误是_ftol2函数在xp系统和win7系统所处的函数地址是不一样的。

如上所述,要解决这个错误就必须找到到底哪个底层库链接了错误的msvcrt.dll。这次我采用的一个笨办法是使用depends打开exe程序,然后一个个地查找其依赖库,最后找到一个opengl32.dll,其视图如下:

从上图可以看出opengl32.dll所依赖的msvcrt.dll呈现红色警告,可以看出opengl32.dll所链接的msvcrt.dll并不对。后来我检查了一下,exe所在目录下有opengl32.dll,把它删掉后程序所用的应该是操作系统目录下的opengl32.dll,这样程序能顺利启动了。

单纯靠depends打开exe程序分析它的依赖库是否存在错误链接的问题这种做法效率无疑有点低,特点是当一个程序的依赖库特别多的时候。我想到的一个可以提高效率的做法是写一个程序通过获取exe的依赖库表,然后逐个进行动态加载(即调用LoadLibrary函数),一旦加载时出现无法定位程序输入点的错误,即可判断该库存在链接的错误。

最新文章

  1. oracle 块的学习——有定义和执行部分的块
  2. 将 JAR 转为 EXE – EXE4J 的使用教程(第一期)(转载)
  3. centos 用dvd创建yum 仓库
  4. R语言画图基础参数设置
  5. 【转】为什么我说 Android 很糟糕
  6. 自适应 or 移动前端页面布局的问题?
  7. elasticsearch使用river同步mysql数据
  8. python基础阶段练习题 拾英札记(1)
  9. spark2.1注册内部函数spark.udf.register("xx", xxx _),运行时抛出异常:Task not serializable
  10. 【C语言】位运算
  11. windows下php7.1安装redis扩展以及redis测试使用全过程
  12. LCA最近公共祖先
  13. python: 爬取[博海拾贝]图片脚本
  14. 查看swap占用情况
  15. 京东返利渠道,自己拿返利,无需A推B操作
  16. Beta冲刺(2/5)(麻瓜制造者)
  17. [转帖]新的Linux后门开始肆虐 主要攻击中国服务器
  18. [Java in NetBeans] Lesson 03. More Variables / Type Casting
  19. j2ee分布式缓存同步实现方案dlcache
  20. 无法将参数 1 从“WCHAR [256]”转换为“const char *”

热门文章

  1. Ubuntu 12.04 LTS为例演示vsftpd虚拟用户 的配置
  2. 大富翁开发日记:一、使用巨型lua协程
  3. kafka之c接口常用API------librdkafka
  4. 阿里云OSS安装使用问题
  5. Entity Framework Code-First(9.1):DataAnnotations - Key Attribute
  6. [CentOS7] 常用工具 之 防暴力破解工具 Fail2ban
  7. .frm和.ibd恢复数据
  8. uoj #5. 【NOI2014】动物园
  9. 洛谷P1896 [SCOI2005]互不侵犯King
  10. bzoj2502: 清理雪道(有源汇有上下界最小流)