对文件和文件夹名称的编译过程支持
包含空格的文件名
对于使用 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_BIN
对MATLAB_BIN
应用相同类型的替换。上述代码特定于nmake
。有关特定于平台的示例,请参阅提供的模板联编文件。
无论使用哪种编译方法,当创建替代名称(短名称)的支持出现问题时,Windows 上都会出现编译错误。如果某个编译生成类似于以下消息的错误消息,请参阅文件夹名称包含空格时的错误故障排除。
NMAKE : fatal error U1073: don't know how to make ' ...
使用操作系统命令(如 system
或 dos
)时,请用双引号 (" "
) 将指定可执行文件或命令参数的路径引起来。例如:
system('dir "D:\Applications\Common Files"')
下表摘要显示了 Windows 的编译文件夹支持和限制。
编译过程文件夹 | 使用 UNC 或空格的路径的方法 | 支持 Windows |
---|---|---|
| 在编译过程中,UNC 位置,例如:
可能重新映射为:
在支持短文件名 (8.3)(默认用于使用 NTFS 的 Windows)的 Windows 系统上进行编译期间,编译过程使用 Windows API 在不支持短文件名 (8.3) 的 Windows 系统(使用 ReFS 或使用 NTFS 且禁用 8.3 支持的系统)上进行编译期间,路径中包含空格的位置,例如:
可能重新映射为:
| 提供编译过程文件夹支持,且不受文件系统(NTFS 或 ReFS)或文件系统关于短文件名支持配置的影响。 限制: 在需要安装位置的驱动器映射的系统上,编译过程要求驱动器号可用于映射。 在不支持短文件名 (8.3) 的系统上(使用 ReFS 或 NTFS 但禁用 8.3 支持),安装位置的最终文件夹不能包含空格。例如,最终文件夹名称:
不受支持。 |
代码生成文件夹 仿真缓存文件夹 自定义代码源文件位置 - 这些位置包括由以下各项指定的文件夹(以及其他文件夹):
| 对于 UNC 位置,编译过程使用 shell 命令 | 提供编译过程文件夹支持,且不受文件系统(NTFS 或 ReFS)或文件系统关于短文件名支持配置的影响。 |
对于包含空格的路径,编译过程可通过 Windows API 来使用 Windows 短路径名称 (8.3):
| 编译过程文件夹支持依赖 NTFS 文件系统,并且需要 Windows 默认支持。注册表将以下项的值设置为 2 或 0:
限制:对于以下各项,编译过程不支持文件夹路径中包含空格:
|
文件夹名称包含空格时的错误故障排除
在 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 资源管理器中,右键点击驱动器图标并选择属性。
错误可能源于使用 NTFS 的系统上的短文件名支持问题。请检查支持为文件、文件夹和路径创建短名称的 Windows 注册表设置。
以管理员身份运行,打开 Windows 命令提示符。例如,在 Windows 的“开始”菜单中,键入
cmd
,右键点击cmd.exe
图标,然后选择以管理员身份运行。通过键入以下内容,转至
windows\system32
文件夹并查询NtfsDisable8dot3NameCreation
状态:> fsutil 8dot3name query
如果
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)。
更改注册表设置只能为更改后创建的文件和文件夹创建短名称。
要为禁用短名称创建时创建的文件创建短名称,请在 Windows 命令行中使用
fsutil
实用工具。要设置短名称,语法是:
> fsutil file setshortname <FileName> <ShortName>
例如,要为长名称
C:\Program Files
创建短名称PROGRA~1
,请键入:> fsutil file setshortname "C:\Program Files" PROGRA~1
C:\Program Files
文件夹名称用引号引起来,因为它包含空格。要验证短名称已创建,请使用具有
/x
选项的dir
命令来显示短名称。> dir C:\ /x
包含特殊字符的文件夹名称
如果与编译相关的文件夹路径包含以下字符,则编译过程可能会生成错误:
不属于系统区域设置的 Unicode® 字符。如果编译过程使用 Microsoft® Visual C++® 编译器,则此限制不适用。
日语(多字节)字符,其中最后一个字节等于十六进制字符
5C
。联编和编译器工具可能会将最后一个字节错误地解释为'\'
(反斜杠)字符。下列字符中的一个或多个字符:
'&'
(“与”符号)':'
(冒号)';'
(分号)'$'
(美元符号)'('
(左圆括号)')'
(右圆括号)'^'
(音调符号)
非常长的文件夹路径
对于 MinGW® 编译器,当命令行长度超出 Windows 32767 个字符的限制时,编译过程会生成错误。如果出现此错误,请检查包含路径的长度。您可以通过在具有较短名称的代码生成文件夹中编译生成的代码来缩短命令行长度
另请参阅
相关主题
- 管理编译过程文件夹
- 管理编译过程文件
- Manage Build Process File Dependencies
- Add Build Process Dependencies
- Build Process Workflow for Real-Time Systems
外部网站
- https://www.mathworks.com/matlabcentral/answers/95399-why-is-the-build-process-failing-with-error-code-nmake-fatal-error-u1073-don-t-know-how-to-make
- https://learn.microsoft.com/previous-versions/windows/it-pro/windows-2000-server/cc959352(v=technet.10)
- https://learn.microsoft.com/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/ff621566(v=ws.11)