首页 > 解决方案 > 强制编译 Matlab 应用程序以使用运行时而不是 Matlab 许可证

问题描述

我的客户有一个无法访问互联网的网络。他们打算购买(很少) Matlab 许可证,只是为了我和我的同事的开发工作。但是,对于他们的员工的操作使用,我应该将我的 Matlab 代码编译为 *.exe 文件,这样操作员就不会仅仅为了执行我的 Matlab“应用程序”/“解决方案”而用尽许可证(语言似乎正在改变这些日子)​​。他们实际上没有mcc许可证,因此编译将在我所在组织的网络上完成。

问题是当编译的可执行文件运行时,似乎没有一种明显的方法可以强制它使用 Matlab Compiler Runtime (MCR)。如果目标系统上有 Matlab 许可证,它也可以使用它。然而,编译的全部目的是避免使用客户端网络上的少数许可证,以便在需要时可以将这些许可证用于 m 文件开发工作。所以这种情况的独特之处似乎是目标环境最终将同时具有 Matlab 许可证MCR,以及编译的可执行文件使用 MCR 而不是 Matlab 许可证的要求。

Mathworks 正在研究这个问题,但找到解决方案的前景尚不清楚。我希望它不会涉及手动重新调整登录脚本来自定义环境 PATH 变量,因为每当更新登录脚本时它都会中断。我希望有一个解决方案,比如顶级 m 文件中的类似 pragma 的语句,或者一个mcc开关。然而,在仔细阅读mcc文档时,除了 之外,没有任何开关将自己显示为可能的候选者-Y license.lic,并且不清楚如何使用它。

关于客户,我面临的另一个限制是我不想用反复试验来纠缠他们(这不是他们的工作)。由于也没有有效的方式向他们传达电子内容,所以这使得情况变得复杂,因此快速、反复的试错已经不复存在。同样,他们的具有 Matlab 许可证的目标环境还不存在,尽管实现目标的过程正在进行中。这有点像先有鸡还是先有蛋的问题。他们基于我们可以找到挑战解决方案的假设来获取 Matlab,但是当目标环境尚不存在时,很难通过调查解决方案来预先取消假设。

在我所在组织的系统上,我也面临着我无权安装 MCR 的限制。因此,我无法通过反复试验来识别忽略 Matlab 许可证存在并强制使用 MCR 的咒语或配方。并不是说我有时间这样做,因为这是实现这一目标的一种非常低效的方式。

由于存在许多环境挑战,试错法不是要走的路,我希望有一种固定的方法可以强制在可能存在的任何 Matlab 许可证上使用 MCR。我正在使用 R2015b。

标签: matlab-deploymentmatlab-compiler

解决方案


我正在使用 Matlab 2015b 处理 OS X / Linux 的这种确切部署情况。当您为基于 Unix 的操作系统编译应用程序时,编译器会创建一个在启动时执行的 shell 脚本。我的解决方案是修改此脚本以检查运行时库的存在。例如,在 OS X (macOS) 上:

  echo "Setting up environment variables"
  if [ -d "/Applications/MATLAB/MATLAB_Compiler_Runtime/v90" ] ; then
    echo "Using MCR v8.6 (R2015b) (_Compiler)"
    MCRROOT=/Applications/MATLAB/MATLAB_Compiler_Runtime/v90
  elif [ -d "/Applications/MATLAB/MATLAB_Runtime/v90" ] ; then
    echo "Using MCR v8.6 (R2015b)"
    MCRROOT=/Applications/MATLAB/MATLAB_Runtime/v90
  elif [ -d "/Applications/MATLAB_R2015b.app" ] ; then
    echo "Using MATLAB R2015b application"
    MCRROOT=/Applications/MATLAB_R2015b.app
  else
    echo "No MATLAB libraries found! Install MCR R2015b from:"
    echo " http://www.mathworks.com/products/compiler/mcr/"
    echo " "
    sleep 10
    exit
  fi

推荐阅读