在git bash脚本中使用cygwin可执行文件


9

我有一个.sh脚本,双击该脚本可在Windows的git中执行该脚本。

现在我需要convert来自cygwin(已安装)的(imagemagick),并使用其绝对路径调用它/c/cygwin64/bin/convert.exe--但我得到:

致命错误-检测到cygheap基本不匹配。此问题可能是由于使用了不兼容的cygwin DLL版本。

将实际convert通话包装在cygwin bash通话中,甚至在cmd.exe通话中也无济于事。这有点奇怪,因为有时我会在.cmd脚本中直接使用cygwin可执行文件,而且这种方法一直有效。

我能做什么?最好将我的程序限制为一个文件的解决方案。

(我知道我可能只可以安装Windows原生imagemagick。但是第二天,我需要在git-for-Win-Shellscript中使用另一个cygwin工具。如果可能,我可能会使我的工作场所中的Windows的git过时了


不要将基于Cygwin的不同产品混搭在一起。请改用Cygwin git。
DavidPostill

谢谢你的评论。对我而言,Windows的git基于cygwin并不明显。我不断读着“ MinGW” ..“ MSYS”等,听起来不像cygwin。只是出于好奇:还有哪些其他产品基于cygwin?
SomeDev

而且我对UnxUtils / GnuWin32 Tools是Windows原生的吗?微软在Windows中正在某种“类似于Linux的环境”上工作(包括bash以及其他可能的好东西)吗?
SomeDev

“我对Windows的git基于cygwin的了解并不明显”,我猜测是基于dll错误消息。您可以检查系统上是否有cygwin dll的多个版本吗?
DavidPostill

Windows 10周年纪念版引入了一项称为Windows子系统的Linux新功能。它包括bash。我没有运行Windows 10,所以我不知道它还包含什么。
DavidPostill

Answers:


7

致命错误-检测到cygheap基本不匹配。

此问题可能是由于使用了不兼容的cygwin DLL版本。

导致此错误的原因是Windows的Git路径与Cywin不兼容。

  • 它们都使用/bin和,/usr/bin但是它们映射到不同的目录(因为它们使用不同的装载表)。

  • Cywin希望在中找到dll /usr/bin/cygwin1.dll(在Windows的Git中找不到)

  • 在Windows 外壳程序的Git中显式运行任何 Cygwin命令时,bashCygwin无法找到其dll并生成上面的错误消息。

  • 请注意,下面的安装映射/是不同的。

Windows版Git:

DavidPostill@Hal MINGW64 ~
$ mount
C:/temp on /tmp type ntfs (binary,noacl,posix=0,usertemp)
C:/apps/Git on / type ntfs (binary,noacl,auto)
C:/apps/Git/usr/bin on /bin type ntfs (binary,noacl,auto)
C: on /c type ntfs (binary,noacl,posix=0,user,noumount,auto)
E: on /e type vfat (binary,noacl,posix=0,user,noumount,auto)
F: on /f type ntfs (binary,noacl,posix=0,user,noumount,auto)

DavidPostill@Hal MINGW64 ~
$ which cygwin1.dll
which: no cygwin1.dll in (/c/Users/DavidPostill/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/mingw64/bin:/usr/bin:/c/Users/DavidPostill/bin:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0:/c/apps/WSCC/Sysinternals Suite:/c/apps/WSCC/NirSoft Utilities:/c/apps/Calibre:/cmd:/mingw64/bin:/usr/bin:/usr/bin/vendor_perl:/usr/bin/core_perl)

DavidPostill@Hal MINGW64 ~
$ /c/cygwin/bin/man
      1 [main] man (608) C:\cygwin\bin\man.exe: *** fatal error - cygheap base mismatch detected - 0x180301408/0x180304408.
This problem is probably due to using incompatible versions of the cygwin DLL.
Search for cygwin1.dll using the Windows Start->Find/Search facility
and delete all but the most recent version.  The most recent version *should*
reside in x:\cygwin\bin, where 'x' is the drive on which you have
installed the cygwin distribution.  Rebooting is also suggested if you
are unable to find another cygwin DLL.
Segmentation fault

Cygwin:

$ mount
C:/cygwin/bin on /usr/bin type ntfs (binary,auto)
C:/cygwin/lib on /usr/lib type ntfs (binary,auto)
C:/cygwin on / type ntfs (binary,auto)
C: on /c type ntfs (binary,posix=0,user,noumount,auto)
E: on /e type vfat (binary,posix=0,user,noumount,auto)
F: on /f type ntfs (binary,posix=0,user,noumount,auto)
$ which cygwin1.dll
/usr/bin/cygwin1.dll
$ /c/cygwin/bin/man
What manual page do you want?

除了不混合并匹配cygwin派生的实用程序外,没有其他解决方案。选择一个并坚持下去。


1
感谢您的解释。解决方案如何?
Jim G.

4
@吉姆 除了不混合并匹配cygwin派生的实用程序外,没有其他一种。选择一个并坚持下去。
DavidPostill

1
没有帮助,因为没有指向解决方案的指针。对于许多不了解导致问题的原因的人来说,这种情况正在发生。
朱利安·奈特

1
不幸的是,我现在与git相关的所有东西都可以使用它。我已经安装了新版本,但是我没有显式使用cygwin,只是git。我什至无法启动git cmd行。因此,我无法找出导致问题的原因并加以解决。仍在研究此方法是否有帮助:github.com/desktop/desktop/issues/3096
朱利安·奈特

2
通过github链接中的解决方案进行了修复。为Windows漏洞利用保护中的所有错误可执行文件关闭ASLR。然后就可以了。无需为Windows卸载git。它通过添加程序名称(例如uname.exe)而不是完整路径来做到这一点。
朱利安·奈特

0

我在Windows 10上遇到了同样的问题。我想知道如何有很多CygWin版本,而我什至找不到cygwin.dll。GitExtensions-> Stash和Git Bash因不同的错误消息而崩溃。解决方案在这里:转到Windows Defender->应用程序和浏览器控件->漏洞利用保护。并使用ASLR关闭三个选项。此后您必须重新启动系统,但这确实有帮助!


这是评论部分的一部分,无法回答问题。
Vishrant
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.