目录
报错现象
Cygwin已经在电脑上常驻了一段时间,安装了不少库文件和应用。在某次安装新应用之后,运行该应用时出现类似如下错误:
[main] make 7780 child_info_fork::abort: C:\cygwin\bin\cygiconv-2.dll: Loaded to different address: parent(0x440000) != child(0x5F0000)
make: fork: Resource temporarily unavailable
错误原因
1️⃣后台有杀毒软件在运行时,杀毒软件的库可能会被加载到Cygwin进程的地址空间,从而产生冲突并给出这个错误(参考来源)。
2️⃣当Cygwin上安装的库过多时,在运行程序时可能会有多个库被加载到重叠的地址段,从而产生冲突并给出这个错误。
DLLs on Windows need to be loaded into memory at non-conflicting base addresses. rebaseall is a cygwin utility that scans all the libraries currently installed and sets each to request a different base address so that none will conflict.
(参考来源)
解决方法
关闭杀毒软件
如果系统有杀毒软件正在运行,先关闭之,再重启Cygwin,观察是否恢复正常。
Rebase库文件
如果不是杀毒软件的问题,或者关闭杀毒软件后仍然报错,我们可以使用Cygwin提供的rebase-trigger工具来进行Cygwin库文件的rebase。进行rebase时,Cygwin会重新指定其每个库的加载位置,以确保它们在加载时不会再重叠(参考来源)。rebase的操作步骤如下:
1️⃣在Cygwin中执行:
rebase-trigger full
2️⃣关闭所有Cygwin进程。
3️⃣打开Cygwin的安装程序setup-x86_64.exe(64位Cygwin)或setup-x86.exe(32位Cygwin),一直前进到最后一步(安装程序包那一步),进度条走完后即完成rebase。
成功rebase后,再次打开Cygwin里的相关应用,现在应该不再报错。