我突然无法在 Cygwin 下运行任何 Perl 脚本。 我尝试运行的每个脚本都会像这样崩溃:
phil@TAICHI /cygdrive/h/bakE/new/virChecked
$ findFiles -s . -t /cygdrive/D/data-comp/text -u /cygdrive/E/new/virChecked/text -d -a .3
Can't load '/home/phil/perl5/lib/perl5/x86_64-cygwin-threads-multi/auto/Win32/File/File.dll' for module Win32::File: No such file or directory at /usr/lib/perl5/5.36/x86_64-cygwin-threads/DynaLoader.pm line 206.
at /usr/local/bin/findFiles line 24.
Compilation failed in require at /usr/local/bin/findFiles line 24.
BEGIN failed--compilation aborted at /usr/local/bin/findFiles line 24.
phil@TAICHI /cygdrive/h/bakE/new/virChecked
$ pushd /home/phil/perl5/lib/perl5/x86_64-cygwin-threads-multi/auto/Win32/File/
~/perl5/lib/perl5/x86_64-cygwin-threads-multi/auto/Win32/File /cygdrive/h/bakE/new/virChecked
phil@TAICHI ~/perl5/lib/perl5/x86_64-cygwin-threads-multi/auto/Win32/File
$ ls -l File.dll
-r-xr-xr-x 1 phil None 178K Jul 14 2021 File.dll*
有时perl无法打开File.dll;有时它无法打开IO.dll。 无论哪种情况,DLL 总是准确地位于 Perl 正在寻找的位置,具有全局读取权限;但 Perl 不会加载它。
Dynaloader.pm 的第 206 行是
my $libref = dl_load_file($file, $flags) or croak("Can't load '$file' for module $module: ".dl_error());
Dynaloader 开头附近的一条评论说:
The load function that dl_load_file() calls may require an absolute pathname.
我找不到 dl_load_file() 的定义位置。 它不在 Dynaloader.pm 中; Dynaloader 唯一包含的模块是 Config,它也没有它,并且不包含其他文件。
我怀疑某些 Perl 模块已更改,导致 dl_load_file 无法将 Cygwin 绝对路径名转换为 Windows 绝对路径名。我尝试重新安装 Perl 5.36.3-1,但没有帮助。 我还进行了新的 Cygwin 安装并安装了 Perl 5.40,但它的行为方式相同。
问题:
POSTSCRIPT 于 10 月 13 日添加:我收到了很多评论,但还没有人回答他们当前是否有 Cygwin Perl 的工作版本这一简单问题。 如果您有最新的 Cygwin Perl 仍然可以工作,请说出来。
我做了一个新的 cygwin 安装只是为了使用 Perl,并且没有安装 Perl,也没有安装任何包含 Perl 的东西(这是限制性的并且极其乏味)。 然后我在 Cygwin 之外的系统上安装了 Strawberry Perl。 我不必设置任何环境变量。 如果不存在其他 Perl,Cygwin 会自动检测并使用 Strawberry Perl。 我可能会将 Strawberry Perl 放在 PATH 的前面,这样我就不再需要在每次更新 cygwin 时检查自动包含列表,以确保没有任何内容依赖于 Perl(因此将安装 Cygwin perl。)