执行ELF读写操作时遇CreateProcess error=193错误求助
这个错误我之前帮不少开发者排查过,其实原因很明确:你在Windows系统里尝试运行的./optimizer是一个Linux平台的ELF格式可执行文件,而Windows的CreateProcess API只能识别PE格式的Windows可执行文件(比如.exe、.com这类),直接执行自然会报错。
给你几个可行的解决方案,按需选择:
换用Windows版本的optimizer工具
如果这个工具提供了Windows编译版本(后缀是.exe的PE格式文件),直接把命令里的./optimizer替换成对应的.exe路径就行。比如:p = r.exec("optimizer.exe " + sourceFile + " " + sourceFile + "a" + " " + "--all -i");要是exe不在当前Java程序的工作目录里,记得写全路径,比如
"C:\\tools\\optimizer.exe"(Java里路径的反斜杠要写两个哦)。通过WSL(Windows子系统)运行
如果你已经装了WSL(比如Ubuntu子系统),可以借助WSL来执行这个Linux二进制文件,命令改成这样:p = r.exec("wsl ./optimizer " + sourceFile + " " + sourceFile + "a" + " " + "--all -i");要注意的是,得确保
optimizer在WSL的文件系统里能找到,或者直接写WSL里的绝对路径,比如"wsl /home/yourname/bin/optimizer"。另外,如果你的sourceFile是Windows下的路径,要转换成WSL能识别的挂载路径(比如C:\test\file.txt对应/mnt/c/test/file.txt),或者确保WSL有权限访问这个文件。用Cygwin/MinGW环境执行
如果你有Cygwin或者MinGW这类类Unix环境,也可以通过它们的bash来运行命令:p = r.exec("C:\\cygwin64\\bin\\bash.exe -c './optimizer " + sourceFile + " " + sourceFile + "a" + " --all -i'");同样要保证
optimizer在Cygwin的环境中是可执行状态,路径也要对应上。
最后给你个小建议:在Java里调用外部命令时,优先用ProcessBuilder代替Runtime.exec(),它能更灵活地处理参数,避免因为参数带空格导致的拆分错误。比如上面的WSL命令可以改成这样:
ProcessBuilder pb = new ProcessBuilder("wsl", "./optimizer", sourceFile, sourceFile + "a", "--all", "-i"); pb.inheritIO(); // 可选,让子进程的输出直接显示在Java程序的控制台里 Process p = pb.start();
内容的提问来源于stack exchange,提问作者FinalYear Nutech

