编译器和链接器错误
当您从 MATLAB® Coder™ 生成库、MEX 函数或可执行文件时,代码生成器会调用 C/C++ 编译器来编译二进制工件。在此过程中可能会出现编译错误。这些错误可能发生在编译阶段、链接阶段或编译的其他阶段。您可以在代码生成报告的编译日志选项卡上查看编译和链接错误和警告。
出现的具体错误消息和警告取决于您的平台所使用的编译器和工具链。要查看当前编译器或选择不同编译器,请在命令提示符下输入:
mex -setup
出现编译错误有许多不同原因。要诊断和修复错误,您可能需要参考编译器文档中列出的错误消息。下面是在生成代码时可能导致编译错误的一些常见问题。
未指定主函数
指定主函数来生成 C/C++ 可执行文件。如果未指定主函数,将会发生编译错误。主函数包含在单独的主文件中。当您生成代码时,MATLAB Coder 会创建一个示例主文件,但不会自动使用它进行编译。示例主函数使用模拟输入值调用生成的代码。您必须修改示例主函数或创建自己的主函数,以便进行真实的输入和输出处理。
您可以将主文件指定为 codegen
命令的命令行参数,或在 MATLAB Coder 中指定主文件,或使用配置参数来指定主文件。有关详细信息和示例,请参阅:
如果希望代码生成器自动使用生成的示例主文件来编译用于测试目的的可执行文件,可以将配置对象的 GenerateExampleMain
属性设置为 'GenerateCodeAndCompile'
。请参阅使用示例主函数合并生成的代码。
未指定外部代码文件
如果您的代码在 coder.ceval
中使用外部 C 函数,则您必须指定包含这些函数的外部文件,否则可能会出现编译错误。您可以将这些外部文件指定为 codegen
命令的命令行参数,或在 MATLAB Coder 中指定外部文件,或通过使用配置参数来指定外部文件。有关详细信息和示例,请参阅:
外部代码导致的错误
在编译过程中引入外部代码时,外部代码会注入自己的错误。外部代码可以通过多个通道引入:
通过使用在外部头文件中定义的
coder.opaque
创建的外部类型定义。通过使用在外部头文件中定义的
coder.cstructname
创建的结构体类型定义。通过使用
coder.ceval
调用外部代码。codegen
命令的外部编译文件的设定。使用
coder.cinclude
或coder.updateBuildInfo
包含外部代码文件。通过 App 的自定义代码选项卡,或通过代码生成配置参数
CustomSource
和CustomInclude
包含外部代码。
以上所列并非全部。要解决这些方法导致的错误,您必须检查并修复外部代码的问题,或将外部代码与您的 MATLAB 代码解耦。
Windows 上的路径长度限制导致的错误
在 Microsoft® Windows® 平台上生成 C/C++ 代码时,当文件名和文件路径的长度超出 Windows 允许的最大长度时,可能会发生错误。在这种情况下,编译器找不到必需的文件或目录。要解决此问题,请尝试以下解决办法之一:
通过将工程文件夹移到更靠近根目录的位置来缩短文件路径。在 Windows 平台上,根目录由反斜杠 (
\
) 表示。使用 Windows 命令
subst
创建直接映射到您的工程文件夹的虚拟驱动器。例如,如果工程文件夹的路径是C:\Users\user1\OneDrive - MyBuisness\Documents\Projects\My MATLAB Project
,请在 Windows 命令提示符下键入以下命令,将虚拟驱动器Z:
直接映射到工程文件夹:运行此命令后,您可以通过键入subst z: C:\Users\user1\OneDrive - MyBuisness\Documents\Projects\My MATLAB Project
Z:
来访问My MATLAB Project
文件夹。有关详细信息,请参阅subst
的 Microsoft 文档。在 Windows 10 版本 1607 和更高版本的平台上,启用长路径支持。请参阅最大路径长度限制的 Microsoft 文档。
Linux 上过时的 C/C++ 编译器版本导致的错误
如果您在 Linux® 平台上运行 MATLAB,并且您的 GCC 编译器比 MATLAB 实例旧得多,则某些使用预编译库的 MathWorks® 工具箱函数的代码生成可能会失败。使用预编译库的工具箱函数包括(但不限于)图像处理函数,例如 imfilter
(Image Processing Toolbox)、bwpack
(Image Processing Toolbox) 和 regionprops
(Image Processing Toolbox)。
要解决此问题,请通过在 Linux 平台上升级 GCC 编译器来更新 glibc
和/或 libstdc++
库。