Windows中文用戶名導致的Dart AOT編譯失敗 我的微軟賬戶一直使用中文用戶名,Windows會把這個用戶名作為用戶文件夾的名稱,而且很難修改. 這就導致凡是放在這個路徑下的文件都得有一個帶中文的絕對路徑. Dart 編譯時可能因為這裡的中文字元而出錯. 問題出現時的操作系統及Dart SD ...
Windows中文用戶名導致的Dart AOT編譯失敗
我的微軟賬戶一直使用中文用戶名,Windows會把這個用戶名作為用戶文件夾的名稱,而且很難修改. 這就導致凡是放在這個路徑下的文件都得有一個帶中文的絕對路徑. Dart 編譯時可能因為這裡的中文字元而出錯.
問題出現時的操作系統及Dart SDK版本
系統 | Windows11 22H2 家庭中文版 |
Dart SDK | version=3.1.3 (stable) (Tue Sep 26 14:25:13 2023 +0000) on "windows_x64" |
問題的發生過程
-
我編寫了一個簡單的Dart HelloWorld程式
source.dart
, 像這樣:展開代碼
import 'dart:io';
void main()
{
print('Hello World!');
var input = stdin.readLineSync(); //輸入一串字元, 再輸出
stdout.writeln('input: $input');
}
-
在文件管理器中, 打開這個
source.dart
文件所在文件夾, 然後右鍵打開PowerShell視窗. 輸入命令:dart compile exe source.dart
這是Dart官方文檔規定的生成exe文件的編譯方法.
-
PowerShell視窗提示:
Error: Unable to read file: C:\Users\某中文用戶名\AppData\Local\Temp\83da944d\kernel.dill ../../runtime/vm/dart_api_impl.cc: 2290: error: Dart_ExitScope expects there to be a current isolate. Did you forget to call Dart_CreateIsolateGroup or Dart_EnterIsolate? ...其他信息... Error: AOT compilation failed Generating AOT snapshot failed!
第一行的信息指出,無法讀取用戶臨時文件夾路徑下的某個文件.
推測的原因及解決辦法
-
原因
Dart編譯過程中需要讀寫系統的用戶臨時文件夾, 而且似乎不允許這個臨時文件夾路徑中有中文字元.
Windows11預設的用戶臨時文件夾路徑是%USERPROFILE%\AppData\Local\Temp //這裡%USERPROFILE%指的是用戶文件夾路徑
可以在 設置→系統→系統信息→高級系統設置→環境變數→用戶變數 查看 TEMP 和 TMP 項目路徑. 我的中文用戶名就出現在這裡.
-
解決辦法
重新指定一個不含中文字元的路徑作為臨時文件夾,保存到系統環境變數裡邊. 把上述 TEMP 和 TMP 項目都修改為C:\UserTemp //不一定是這個路徑, 可以指定為別的路徑
然後保存.
-
測試
到程式源文件位置重新打開PowerShell視窗, 輸入dart compile exe source.dart
隨後提示
Generated: 當前路徑\source.exe
在文件管理器中可以看到預期的exe文件確實已生成. 打開此文件, 出現下麵的視窗
說明此exe文件能夠正常執行,問題已經解決了.