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
그렇지 않습니다.