Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

对文件和文件夹名称的编译过程支持

包含空格的文件名

对于使用 ToolchainInfo 对象的编译过程,只有以下工具链支持使用包含空格的文件名:

  • Linux® 上的 GNU gcc/g++ | gmake (64-bit Linux)

  • Windows® 上的 MinGW64 | gmake (64-bit Windows)

  • Mac 上的 Xcode with Clang | gmake (64-bit Mac)

使用模板联编文件的编译过程不支持使用包含空格的文件名。

包含空格的文件夹名称

在 Windows 系统上,对于以下任一情况,代码生成器映射一个与 MATLAB® 安装文件夹对应的驱动器:

  • matlabroot 文件夹是 UNC 位置。

  • matlabroot 文件夹的路径包含空格,并且系统不支持替代名称。

以下文件夹路径可以包含空格:

  • 您的 MATLAB 安装文件夹 (matlabroot) 的路径。例如 C:\Program Files\MATLAB\R2015b

  • 开始编译的当前工作文件夹 (pwd) 的路径。例如,C:\Users\username\Documents\My Work

  • 编译过程使用的编译器的安装文件夹的路径。

如果您的工作环境包括一个或多个上述场景,请使用以下支持机制来支持编译过程:

  • 如果您使用工具链方法编译生成的代码,系统对文件夹名称中空格的支持会影响工具链操作:

    • 对于启用 8.3 名称创建的 Linux 系统和 Windows 系统,工具链通过使用操作系统中的替代名称来管理文件夹名称中的空格。工具链使用 TransformPathsWithSpaces 属性来管理这些名称。

      addAttribute(toolchainObject, 'TransformPathsWithSpaces', true);

      驱动器和文件夹的安全权限可以确定工具链是否转换路径。例如,如果路径包含的某个文件夹的安全配置禁止 8.3 路径转换,则工具链不会转换路径,并且编译过程会产生警告。

    • 对于禁用 8.3 名称创建的 Windows 系统,工具链通过使用批处理文件 (.bat) 映射网络驱动器来管理文件夹名称中的空格。此操作需要将 RequiresBatchFile 属性添加到工具链定义中。

      addAttribute(toolchainObject, 'RequiresBatchFile', true);

    为 Windows 系统开发工具链时,请设置这两个属性。有关工具链属性的详细信息,请参阅 addAttribute

  • 如果您使用模板联编文件方法来编译生成的代码,模板联编文件 (.tmf) 需要代码来管理文件夹名称中的空格。当替代文件夹名称(Windows 短名称)不同于文件系统文件夹名称(Windows 长名称)时,请将以下代码添加到联编文件中。

    ALT_MATLAB_ROOT         = |>ALT_MATLAB_ROOT<|
    ALT_MATLAB_BIN          = |>ALT_MATLAB_BIN<|
    !if "$(MATLAB_ROOT)" != "$(ALT_MATLAB_ROOT)"
    MATLAB_ROOT = $(ALT_MATLAB_ROOT)
    !endif
    !if "$(MATLAB_BIN)" != "$(ALT_MATLAB_BIN)"
    MATLAB_BIN = $(ALT_MATLAB_BIN)
    !endif

    当位置标记的值不相等时,以下代码用 ALT_MATLAB_ROOT 替换 MATLAB_ROOT。替换指示您的 MATLAB 安装文件夹的路径包含空格。以下代码使用 ALT_MATLAB_BINMATLAB_BIN 应用相同类型的替换。上述代码特定于 nmake。有关特定于平台的示例,请参阅提供的模板联编文件。

无论使用哪种编译方法,当创建替代名称(短名称)的支持出现问题时,Windows 上都会出现编译错误。如果某个编译生成类似于以下消息的错误消息,请参阅文件夹名称包含空格时的错误故障排除

NMAKE : fatal error U1073: don't know how to make ' ...

使用操作系统命令(如 systemdos)时,请用双引号 (" ") 将指定可执行文件或命令参数的路径引起来。例如:

system('dir "D:\Applications\Common Files"')

下表摘要显示了 Windows 的编译文件夹支持和限制。

编译过程文件夹使用 UNC 或空格的路径的方法支持 Windows

matlabroot 文件夹

matlabroot 值派生自 MATLAB 安装位置。

在编译过程中,UNC 位置,例如:

\\networkdrive\matlab\R20xxb

可能重新映射为:

T:\

在支持短文件名 (8.3)(默认用于使用 NTFS 的 Windows)的 Windows 系统上进行编译期间,编译过程使用 Windows API getShortPathName() 作为文件夹位置。

在不支持短文件名 (8.3) 的 Windows 系统(使用 ReFS 或使用 NTFS 且禁用 8.3 支持的系统)上进行编译期间,路径中包含空格的位置,例如:

C:\Program Files\MATLAB\R20xxb

可能重新映射为:

T:\R20xxb

提供编译过程文件夹支持,且不受文件系统(NTFS 或 ReFS)或文件系统关于短文件名支持配置的影响。

限制:

在需要安装位置的驱动器映射的系统上,编译过程要求驱动器号可用于映射。

在不支持短文件名 (8.3) 的系统上(使用 ReFS 或 NTFS 但禁用 8.3 支持),安装位置的最终文件夹不能包含空格。例如,最终文件夹名称:

C:\Program Files\MATLAB\R20xxb sp1

不受支持。

代码生成文件夹

仿真缓存文件夹

自定义代码源文件位置 - 这些位置包括由以下各项指定的文件夹(以及其他文件夹):

  • rtwmakecfg.m

  • 模型配置参数附加编译信息

  • 代码替换库

对于 UNC 位置,编译过程使用 shell 命令 pushdpopd 临时映射一个驱动器。

提供编译过程文件夹支持,且不受文件系统(NTFS 或 ReFS)或文件系统关于短文件名支持配置的影响。

对于包含空格的路径,编译过程可通过 Windows API 来使用 Windows 短路径名称 (8.3):

getShortPathName()

编译过程文件夹支持依赖 NTFS 文件系统,并且需要 Windows 默认支持。注册表将以下项的值设置为 2 或 0:

NtfsDisable8dot3NameCreation

限制:对于以下各项,编译过程不支持文件夹路径中包含空格:

  • 禁用短路径名称支持的 NTFS 文件系统

  • ReFS 文件系统(此文件系统不支持短路径名称)

文件夹名称包含空格时的错误故障排除

在 Windows 上,当支持创建短文件名出现问题时,编译过程可能出错。当此问题影响到编译时,您会看到类似以下内容的错误消息:

NMAKE : fatal error U1073: don't know how to make 'C:\Work\My'

如果文件夹名称 (C:\Work\My Models) 中的空格导致编译过程找不到要编译的模型或文件,则会出现此消息。有关对文件夹名称或路径中的空格敏感的编译相关文件夹的描述,请参阅包含空格的文件夹名称

为了避免在禁用 Windows 短文件名支持时因文件夹名称中包含空格而出现问题,请不要使用包含空格的路径。例如,将第三方软件安装到不包含空格的路径中。对于包含模型、源文件或库的文件夹,不要使用包含空格的路径。

使用包含空格的文件夹名称的编译可能会出现问题,因为可能会禁用 Windows 替代名称支持。在 Windows 系统上,编译过程使用这种替代名称支持。这种文件、文件夹和路径替代名称支持有许多相关术语:

  • 8.3 名称

  • DOS 路径

  • 短文件名(SFN,即 ShortFileName 的缩写)

  • 长名称别名

  • Windows 路径别名

确认驱动器使用的文件系统的类型。在 Windows 资源管理器中,右键点击驱动器图标并选择属性。

  • 如果文件系统是 ReFS(复原文件系统),就会出现问题。ReFS 不支持短文件名。除了 MATLAB 安装文件夹之外,编译过程不支持 ReFS 文件系统的包含空格的文件夹名称。如果您的工作环境要求编译文件夹或其他外部代码文件夹支持短文件名,请不要使用 ReFS。

  • 如果文件系统是 NTFS(新技术文件系统),则编译错误可能与注册表设置不兼容有关。请继续执行故障排除步骤。

错误可能源于使用 NTFS 的系统上的短文件名支持问题。请检查支持为文件、文件夹和路径创建短名称的 Windows 注册表设置。

  1. 以管理员身份运行,打开 Windows 命令提示符。例如,在 Windows 的“开始”菜单中,键入 cmd,右键点击 cmd.exe 图标,然后选择以管理员身份运行

  2. 通过键入以下内容,转至 windows\system32 文件夹并查询 NtfsDisable8dot3NameCreation 状态:

    > fsutil 8dot3name query
  3. 如果 NtfsDisable8dot3NameCreation 的注册表状态不为 0(对系统上的所有卷启用 8dot3 名称创建),请通过键入以下内容将该值更改为 0:

    > fsutil 8dot3name set 0

    有关启用短名称创建的详细信息,请参阅 https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/ff621566(v=ws.11)

    更改注册表设置只能为更改后创建的文件和文件夹创建短名称。

  4. 要为禁用短名称创建时创建的文件创建短名称,请在 Windows 命令行中使用 fsutil 实用工具。

    要设置短名称,语法是:

    > fsutil file setshortname <FileName> <ShortName>

    例如,要为长名称 C:\Program Files 创建短名称 PROGRA~1,请键入:

    > fsutil file setshortname "C:\Program Files" PROGRA~1

    C:\Program Files 文件夹名称用引号引起来,因为它包含空格。

  5. 要验证短名称已创建,请使用具有 /x 选项的 dir 命令来显示短名称。

    > dir C:\ /x

包含特殊字符的文件夹名称

如果与编译相关的文件夹路径包含以下字符,则编译过程可能会生成错误:

  • 不属于系统区域设置的 Unicode® 字符。如果编译过程使用 Microsoft® Visual C++® 编译器,则此限制不适用。

  • 日语(多字节)字符,其中最后一个字节等于十六进制字符 5C。联编和编译器工具可能会将最后一个字节错误地解释为 '\'(反斜杠)字符。

非常长的文件夹路径

对于 MinGW® 编译器,当命令行长度超出 Windows 32767 个字符的限制时,编译过程会生成错误。如果出现此错误,请检查包含路径的长度。您可以通过在具有较短名称的代码生成文件夹中编译生成的代码来缩短命令行长度

另请参阅

相关主题

外部网站