# 生成求解器失败问题说明
对生成求解器失败的问题的原因进行分析说明。
生成求解器失败一般会生成build.log文件,可以根据build.log文件中的报错信息定位失败原因。如果生成求解器失败报未知错误或者创建 C 代码进程失败则没有build.log文件生成。下面对生成求解器失败的每一种报错以及原因进行说明。
# 未知错误
到目前为止这种错误出现原因为Simulator/Bin(64)下的build_gcc.bat/build_vc.bat/build_gcc.sh文件没有可执行权限。要确保Simulator/Bin(64)下的所有.bat/.sh文件都有可执行权限。 Windows 下没有可执行权限的原因可能是杀毒软件阻止了bat脚本的运行,需要退出杀毒软件或者设为信任项。Linux 下没有可执行权限,需要使用命令设置为有运行权限。
# 创建 C 代码进程失败
可能是缺少 Simulator,检查安装目录下是否有 Simulator。也可能是本地环境问题导致 C 进程失败,本地环境问题目前还没有确定的解决方案,可以尝试重装 Sysplorer。
# 不能覆盖模型目标文件(.o 或 .obj文件)
生成求解器时编译生成的 C 代码前,如果仿真结果目录文件夹下有编译生成的目标文件(上次编译时生成的临时文件,Linux 下为.o文件,Windows 下为.obj文件),则会先删除上次编译生成的目标文件。如果已有文件无法删除,会报不能覆盖模型目标文件(.o或.obj文件)错误。
出现这个错误请检查临时文件是否被占用,对临时文件夹是否具有写权限。
# 生成目标文件(.o 或 .obj)未能成功
代码生成完成后,会将生成 C 代码和外部函数代码(如果有)编译成当前平台的库文件。如果编译失败,则会报“生成目标文件(.o或.obj)未能成功”的错误。出现此错误先查看仿真结果目录下的build.log文件,从文件内容查看编译时的报错信息,此错误信息为 C 编译器报出,一般是生成的 C 代码或者外部函数代码中有错误导致编译失败,根据报错信息检查代码。如果是外部函数代码报错,根据报错修改外部函数代码,如果是 Sysplorer 自动生成的 C 代码报错,则可作为 bug 反馈。
# 生成 MWSolver.dll 文件未能成功
所有 C 代码(Sysplorer 生成的 C 代码和外部 C 代码)编译成动态库后, 会将这些编译好的库链接生成MWSolver.dll文件, 供求解阶段使用。如果链接过程出错,会报“生成MWSolver.dll文件未能成功错误”,出现此错误是因为链接的库有问题。如果模型中使用了外部函数需要优先检查模型中依赖的外部库是否有问题。主要从以下几个点检查:
- 在 Sysplorer 中选择的位数与外部库位数是否一致,如:Sysplorer 中选择 64 位,实际只有 32 位外部库。
- 如果使用的外部库是静态库,需要保证编译静态库的编译器版本与 Sysplorer 中选择的编译器版本完全一致,如:外部静态库是使用 VS2017 编译出来的,那么 MWORKS 中的编译器也必须选择 VS2017,否则可能出现因编译器版本不兼容导致的链接失败的错误。
提示
如果使用动态库则不会有编译器版本不兼容的问题,因此建议将外部函数代码编译成动态库在 Sysplorer 中使用,可使用 Sysplorer 提供的 MEX 功能。
- 使用的外部库本身有错误,可以自己写一个程序调用外部库中的函数,看是否能够正确调用。
- Sysplorer 生成的代码编译出的库有错误,可作为 bug 反馈。
出现该错误,在仿真结果目录下会生成build.log文件,可以根据build.log文件中的内容判断是外部函数库有问题,还是 Sysplorer 生成的代码编译器的库有错误。
# 找不到有效的 C 编译器
出现这个错误是 Sysplorer 中的编译 C 代码脚本在编译之前通过编译器命令验证编译器有效性时失败。一般是 C 编译器路径设置错误或者 C 编译器安装有问题。可以检查以下几点:
- 检查 Sysplorer 中设置的 C 编译器路径是否有错误。
- 在 Sysplorer 中设置 C 编译器页面点击校验编译器,检查编译器是否能够校验通过。
- 本地通过运行编译器自带的校验脚本或者自己写命令检查编译器是否能够正常使用。