强制编译 Matlab 应用程序以使用运行时而不是 Matlab 许可证

Posted

技术标签:

【中文标题】强制编译 Matlab 应用程序以使用运行时而不是 Matlab 许可证【英文标题】:Force compiled Matlab app to use runtime rather than a Matlab license 【发布时间】:2018-06-23 20:09:29 【问题描述】:

我的客户的网络无法访问互联网。他们打算购买(很少) 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 的咒语或配方。并不是说我有时间这样做,因为这是实现这一目标的一种非常低效的方式。

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

【问题讨论】:

不应该涉及任何“强制”,在使用您的可执行文件的客户端计算机上安装 MCR 就足够了。我无法从你的描述中理解——你连那个都做不到吗? 我刚刚启动了将可执行文件传输到客户端的通信。迄今为止的本地测试包括在没有 Matlab 的独立设备上成功运行可执行文件。最终的目标环境将安装 MCR 并访问 Matlab 许可证。在孤立的每一个条件下,我知道可执行文件将运行。我想通过一种方法确保可执行文件将使用 MCR 而不是 Matlab 许可证来消除不确定性。我寻求一个固定的解决方案,因为我目前无法复制该环境来尝试潜在的解决方案。 哪些操作系统用于编译和部署? 发帖时客户端系统是Windows 7,但它可能很快就会变成Windows 10。我对客户网络没有清晰和持续的可见性。 TMW 最终回来澄清了编译的可执行文件如何选择是依赖于 Matlab 许可证还是 MCR。我已经发布了详细信息作为这个问题的答案。 【参考方案1】:

我正在使用 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

【讨论】:

谢谢,mhopeng,但讨论的主机系统(在发帖时)是 Windows 7。从那时起,我们听说即将迁移到 Windows 10 的传言,但没有给出时间表。 【参考方案2】:

TMW 的回应:

运行使用 MATLAB Compiler 构建的独立应用程序不会检查任何许可,无论是针对已安装的 MATLAB Compiler Runtime 还是针对作为 MATLAB Compiler 安装的一部分安装的运行时运行。请注意,在未安装 MATLAB Compiler 的情况下安装了 MATLAB 的最终用户将不会在其安装中包含编译器运行时库。

如果您已安装 MATLAB Compiler Toolbox,MATLAB 将有一个“运行时”文件夹,其中包含执行独立应用程序所需的 DLL。如果没有 MATLAB Compiler Toolbox,这些 DLL 将不可用。相反,用户必须安装 MCR 才能运行独立应用程序...如果用户没有安装 MATLAB Compiler Toolbox 并且希望运行独立应用程序,则用户不能放弃安装 MCR。

【讨论】:

以上是关于强制编译 Matlab 应用程序以使用运行时而不是 Matlab 许可证的主要内容,如果未能解决你的问题,请参考以下文章

如果基本情况不是在恒定运行时而是在多项式运行时运行,主定理是不是适用?

如何使用用户预定义的数据设置 mwArray?是不是可以混合使用 Matlab 库编译器和 mex 运行时?

如何检查 Matlab 编译器运行时 (MCR) 在我的电脑上是不是正常工作?

强制 c++ 程序使用 dos() 将“同步”输出显示到 MATLAB 命令窗口

vbscript 检查是不是安装了 Matlab 运行时编译器

强制java以用户输入作为消息进行编译错误