解决Windows中文用户名导致的Dart AOT编译失败问题

寻技术 Windows 2024年01月21日 144

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"

 

问题的发生过程


  1. 我编写了一个简单的Dart HelloWorld程序source.dart, 像这样:

    展开代码
    import 'dart:io';
    

    void main()
    {
    print('Hello World!');
    var input = stdin.readLineSync(); //输入一串字符, 再输出
    stdout.writeln('input: $input');
    }


     

  2. 在文件管理器中, 打开这个source.dart文件所在文件夹, 然后右键打开PowerShell窗口. 输入命令:

    dart compile exe source.dart
    

    这是Dart官方文档规定的生成exe文件的编译方法.

  3. 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 项目路径. 我的中文用户名就出现在这里.

     

  • 解决办法

    重新指定一个不含中文字符的路径作为临时文件夹,保存到系统环境变量里边. 首先新建一个文件夹,例如

    C:\UserTemp      //不一定是这个路径, 可以指定为别的路径
    

    把上述 TEMP 和 TMP 项目都修改为这一路径,然后保存.
     

  • 测试

    到程序源文件位置重新打开PowerShell窗口, 输入

    dart compile exe source.dart
    

    随后提示

    Generated: 当前路径\source.exe
    

    在文件管理器中可以看到预期的exe文件确实已生成. 打开此文件, 出现下面的窗口

    说明此exe文件能够正常执行,问题已经解决了.

关闭

用微信“扫一扫”