Flutter生成的Windows可执行文件CMD无输出问题求助
解决Flutter Windows可执行文件CMD无输出问题
你的问题核心原因是:Flutter默认编译的Windows应用是GUI程序,而非控制台程序,所以stdout/stderr输出不会绑定到当前CMD窗口,但重定向到文件时输出流本身是正常工作的,因此文件能拿到内容。
下面给你两种可行的解决办法:
方法一:修改编译配置,编译成控制台应用
这种方式会让程序始终以控制台模式运行,打开exe时会自动弹出控制台窗口(如果直接双击的话),CMD中运行也能直接看到输出。
- 打开项目根目录下的
windows/CMakeLists.txt文件 - 在
add_executable(${BINARY_NAME} WIN32 "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" "main.cpp" "flutter_window.cpp" "utils.cpp" "win32_window.cpp")这一行之后,添加以下配置:set_target_properties(${BINARY_NAME} PROPERTIES WIN32_EXECUTABLE FALSE ) - 重新执行
flutter build windows编译,生成的exe就能在CMD中直接输出内容了。
方法二:代码中手动附加到父进程控制台
这种方式不需要修改编译配置,程序依然是GUI程序,但在被CMD调用时会主动附加到CMD的控制台窗口,输出内容。
在你的dart代码开头添加控制台附加逻辑:
import 'dart:ffi'; import 'dart:io'; import 'package:args/args.dart'; // 调用Windows API附加到父进程控制台 typedef AttachConsoleFunc = Int32 Function(Uint32 dwProcessId); typedef AttachConsole = int Function(int dwProcessId); void attachConsole() { final kernel32 = DynamicLibrary.open('kernel32.dll'); final attachConsole = kernel32.lookupFunction<AttachConsoleFunc, AttachConsole>('AttachConsole'); const ATTACH_PARENT_PROCESS = 0x0ffffffff; attachConsole(ATTACH_PARENT_PROCESS); } void main(List<String> args) { attachConsole(); // 先执行附加操作 var parser = ArgParser()..addOption("type", abbr: 't', defaultsTo: 'default'); try { final ArgResults argResults = parser.parse(args); final String type = argResults['type'] as String; stdout.writeln('Type: $type'); exit(0); } on Exception catch (e) { stderr.writeln("error on parsing args : $e"); exit(1); } }
重新编译后,在CMD中运行exe就能看到输出了。
开发阶段测试小技巧
如果只是开发阶段想测试输出,不用每次都编译exe,可以直接用:
flutter run -d windows --console
这个命令会强制以控制台模式启动应用,运行时就能看到输出内容。
内容的提问来源于stack exchange,提问作者Yowims
相关产品推荐
相关产品推荐

