foo.exe
対話型入力を必要とする古いFortran実行可能ファイルがあります。
foo.exe
Cywinでダイヤルすると、インタラクティブな入力を要求するメッセージが表示され、プログラムが正しく実行されます。
WSLから呼び出すと、foo.exe
対話型入力を要求するメッセージが表示され、プログラムが正しく実行されます。
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
正常に動作しました。
これで、WSLを使用してスクリプトを実行したり入力を送信new_foo.exe
したり、正常に動作しましたが(以前はこれを実行できませんでした)、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
そうではありません。