============== Cygwin 版本

============== 
Cygwin 版本

我有一个旧的 Fortran 可执行文件foo.exe,需要交互式输入。

如果我foo.exe从 Cywin 拨打电话,系统会提示我进行交互式输入,并且程序运行正常。

如果我foo.exe从 WSL 调用,系统会提示我进行交互式输入,并且程序运行正常。


我想运行一个脚本或发送输入,foo.exe这样我就不需要经历交互式输入所有内容的过程。

在 Cygwin 中我执行以下操作:

foo.exe << EOI
1
1
Test
Out
EOI

一切都很好!

我尝试在 WSL 中执行相同的操作,但收到以下错误消息:

forrtl: An attempt was made to move the file pointer before the beginning of the file.
forrtl: severe (39): error during read, unit -4, file CONIN$
Image              PC        Routine            Line        Source
libifcorert.dll    1003A159  Unknown               Unknown  Unknown


所以我抓住了原始文件foo.f并尝试使用重新编译它gfortran

gfortran foo.f -o new_foo.exe

然后,我尝试从 Cygwin 进行交互调用new_foo.exe,并得到以下信息:

bash: ./newfoo.exe: cannot execute binary file: Exec format error

因此,过去在 Cygwin 中有效的功能不再有效。

然后我尝试从 WSL 进行交互调用new_foo.exe,效果很好。

我现在可以运行脚本或new_foo.exe使用 WSL 发送输入,并且工作正常(以前无法做到这一点),但我失去了在 Cygwin 上执行此操作的能力。前进一步,后退两步??


然后我想也许我应该使用 32 位重新编译它:

gfortran -m32 foo.f -o new_foo_32.exe

此 32 位编译的程序无法与 Cygwin 或 WSL 一起使用,并会出现以下错误:

bash: ./newfoo.exe: cannot execute binary file: Exec format error

最终目标是拥有一个可以在 Cygwin 和 WSL 上交互运行的单个 foo.exe 程序(我的原始代码就是这样做的)允许我在 Cygwin 和 WSL 上通过管道/发送输入(我的原始代码只允许我在 Cygwin 中执行此操作)。

有什么建议么?

==============
Cygwin 版本

CYGWIN_NT-10.0-WOW 
<computer> 2.4.1(0.293/5/3) 
2016-01-24 11:24 i686 Cygwin

==============
WSL 版本

Linux <computer> 4.4.0-18362-Microsoft 
#476-Microsoft Fri Nov 01 16:53:00 PST 2019 
x86_64 x86_64 x86_64 GNU/Linux

Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:        20.04
Codename:       focal

答案1

我认为.exe在 Cygwin 下生成的文件对 Cygwin 有一些依赖,对吧?显然,至少就标准输入管道处理而言。

我很好奇如果你在 PowerShell 中执行此操作会发生什么:

@"
1
1
Test
Out
"@ | foo.exe

我希望(至少让您走上正确的轨道)它会导致您在 WSL 中看到的相同错误。

怎么样(在 WSL 中):

/mnt/C/cygwin/bin/bash.exe -c "foo.exe" << EOI
1
1
Test
Out
EOI

至于相反,在 WSL 中,编译器应该生成一个 Linux ELF 二进制文件,它并不是真正的.exe. Cygwin 可能试图将其作为 Windows 启动.exe,但事实并非如此。

相关内容