现象:
之前网上下了一个cygwin的本地安装版本,装了一些常用的命令行工具集。结果执行最为常用的ls命令时总是报如下的错误:“无法定位程序输入点 strtoumax 于动态链接库 cygwin1.dll 上”。地球人都知道,unix下不能使用ls命令,尘世间最痛苦的事莫过于此啦~
原因:
在网上搜了一下,看到关于cygwin的介绍:
“cygwin的工作机制:cygnus当初首先把gcc,gdb,gas等开发工具
进行了改进,使他们能够生成并解释win32的目标文件。然后,他们要把
这些工具移植到windows平台上去。一种方案是基于win32 api对这些工
具的源代码进行大幅修改,这样做显然需要大量工作。因此,他们采取
了一种不同的方法——他们写了一个共享库(就是cygwin dll),把win32
api中没有的unix风格的调用(如fork,spawn,signals,select,sockets等)封装在里面,也就是说,他们基于 win32 api写了一个unix系统库
的模拟层。这样,只要把这些工具的源代码和这个共享库连接到一起,
就可以使用unix主机上的交*编译器来生成可以在 windows平台上运行的
工具集。以这些移植到windows平台上的开发工具为基础,cygnus又逐步
把其他的工具(几乎不需要对源代码进行修改,只需要修改他们的配置
脚本)软件移植到windows上来。这样,在windows平台上运行bash和开
发工具、用户工具,感觉好像在unix上工作。”
从上面的文字了解到,前面报错的动态链接库cygwin1.dll实质就是一个操作系统的接口适配层,所报的错误应该是在该库中没有找到被ls命令调用的接口函数strtoumax。因此,造成该错误的原因极有可能是该动态库版本与所用的ls命令不匹配。
解决:
分析出原因,解决的方法就再简单不过啦。从网上下载新的cygwin1.dll。和本地安装的比较一下文件版本号:原来的版本号是1005.15.0.0,新下载的版本号是1005.18.0.0。再用Dependency Walker看一下新下载的dll导出的接口,果然有strtoumax。使用新dll替换原来bin目录下的dll,问题就解决啦^_^
原文地址:http://blog.sina.com.cn/s/blog_4c31626a010008rn.html