昨天尝试使用git克隆github中的代码仓库失败,报错误“fatal: unable to access 'https://github.com/myname/study.git/': Protocol https not supported or disabled in libcurl”。
晚上查看解决方法,发现只要删除文件“C:\Windows\SysWOW64\libcurl.dll”即可。
问题是我在计算机上搜索libcurl.dll时,发现多处存在此文件,包括很多软件的安装目录,包括git的安装目录(如下图)。
我的问题是:
1. 我删除libcurl.dll文件,是否会对我的系统以后的运行产生影响?如何解决?
2. 既然git的安装目录已经存在libcurl.dll文件,为什么“SysWOW64”下的libcurl.dll文件还会对git的工作产生影响?
3. libcurl.dll作用是什么?
git.exe 也是在 C:\Pro....\Git\Bin 目录下吗?
是的,只在“[git]\bin”和“[git]\cmd”中,存在git.exe。
不过,在系统变量的PATH中,只应用了“[git]\bin”。(但是这个路径引用了两边)
@闫冬 的地盘: 你已经删除了 SysWOW64 目录下的 libcurl.dll,那么你现在再把 git\bin 目录下的 libcurl.dll 也删除了,你再看看能 git 能访问 https 不?如果能访问,你再检查下 git\bin 目录下是否有 libcurl.dll。
@Launcher: 删除 [git]/bin/libcurl.dll后再进行git clone,报错“找不到libcurl.dll”,不会再自动创建此文件;然后我将[SysWOW64]/libcurl.dll还原(git中的libcurl还处于删除状态),执行“git clone”,依旧报错:“Protocol https not supported or disabled in libcurl”。
基本可以定位:在git clone时,优先使用“SysWOW64”中的libcurl.dll,其次使用git自带的libcurl.dll。
@闫冬 的地盘: 动态链接库的搜索路径优先级为:应用程序所在目录→当前目录→Windows SYSTEM目录→Windows目录→PATH环境变量指定的路径。
如果使用 LoadLibrary 的话,应用程序可以自己调整搜索动态链接库的路径顺序。
libcurl 是开源的网络客户端库,支持多种协议,比如 HTTP,HTTPS ,FTP,FTPS 等,很多开发者会自己使用源码编译,而 libcurl 也允许开发者编译时指定一些参数,启用或禁用某些功能。你遇到的问题就是 SysWOW64 目录下的 libcurl.dll 编译时禁用了 SSL 功能。
@Launcher: 这正是我当前疑惑的地方。命令git有自己的libcurl.dll,怎么还会因为[SysWOW64/libcurl.dll]的存在而导致“git clone”失败?
刚刚,我又做了一个实验:删除[git]/bin/git.exe,然后运行指令“git help”,结果报错:'git' 不是内部或外部命令,也不是可运行的程序或批处理文件。由此可见,控制台中git指令的目标程序就是[git]/bin/git.exe。
而这里也确实存在一个文件:[git]/bin/libcurl.dll。
@闫冬 的地盘: 你在“运行”中输入“cmd”,然后输入:cd C:\Program Files (x86)\Git\bin,然后输入 git.exe。
@Launcher: 在git.exe存在的情况下,进行您要求的操作,结果如下图:
@闫冬 的地盘: 少说一句,访问 https,看它搜索 dll 的优先级。
@Launcher: 很抱歉,我并没有找到 “访问https,查看它搜索dll的优先级” 的实现方式。它需要什么指令或操作来实现呢?
git.exe https://... : 这是一个错误的指令,git不能识别。
git.exe clone ... : 此指令得到的结果与“git clone”,没有区别。
直接运行git.exe,弹出的控制台窗口会立刻关闭。
@闫冬 的地盘: 那你“昨天尝试使用git克隆github中的代码仓库失败”这个是怎么做的呢?
http://hubingforever.blog.163.com/blog/static/171040579201241955252151/
@Launcher: 我可以通过指令“git.exe clone”实现一次git访问https,但是我如何“查看它搜索dll的优先级”呢?
通过之前的验证方式,再来一次吗?即先删除SysWOW64中的文件,执行一次;再删除git中的libcurl.dll文件,执行一次。
这样的话,我预计,结果和之前的验证也接过没有什么不同。因为之前通过另一个实验已经证明了,“git”命令,启动的就是程序:git.exe。
@闫冬 的地盘: 对。如果还一样,你用 depends.exe 查看 git.exe 依赖的 dll 中有没有 libcurl.dll,以及路径是什么。还是要分 SysWOW64 目录和 git\bin 目录查看。
@Launcher:
您好!工具depends.exe我前天用过了,可惜没有找到有用的信息,因为它给出的列表中找不到libcurl.dll。在使用这个工具解析“git.exe”时,报了一些错误,我估计是这些错误导致的“找不到libcurl.dll”。因为我现在使用的不是前天的电脑,所以具体截图也没有。
不过昨天我又在另一台电脑上安装了git,没有进行任何特殊的修改,就可以正常使用git clone命令。我刚刚找了一下它与上一台电脑的不同点。发现两处:
1. 它调用的是[git]/cmd中的git.exe文件。不是[git]/bin中的git.exe。(虽然它在bin中也有这个文件)
2. [SysWOW64]中没有libcurl.dll文件。
所以我怀疑两点:上一台电脑中,调用的文件git.exe错了;上一台电脑中libcurl.dll不是系统自带的,而是后来安装软件产生的。解决这两个疑点我需要明天才能验证。
不知道这两点信息对于解释“关于git.exe调用动态链接库libcurl.dll顺序异常”,有没有提供一些思路。
@闫冬 的地盘: [git]/cmd 目录下有 libcurl.exe 吗?
@闫冬 的地盘: 工具depends.exe我前天用过了,可惜没有找到有用的信息,因为它给出的列表中找不到libcurl.dll
-> 从 git.exe 的所有非系统 dll 依赖项中去查找,如果都没有,那么 git.exe 就是使用 LoadLibrary 来调用 libcurl 的,然后 libcurl 还有个 shell 工具,这个 shell 工具是个 exe,你在git/bin 下找找。如果 git.exe 调用 licurl shell 工具来请求的话,也不会有依赖 libcurl.dll 的情况出现。
@Launcher: 很抱歉,这个帖子耽误到现在。原来打算找学习C/C++的朋友帮忙,怎么使用您说的工具depends.exe。但到了现在,一直没有成果。如今,已经没有深究下去的意愿了。
但是,依旧十分感谢您的解答,某种程度上来说,你的精炼的解答为我打开了另一扇门。谢谢!