关于Linux下安装MATLAB Compiler Runtime(MCR) 所遇到的问题以及解决方法(以Ubuntu 16.04 为例)

关于Linux下安装MATLAB Compiler Runtime(MCR) 所遇到的问题以及解决方法(以Ubuntu 16.04 为例)


要解决的问题

  • 通过MATLAB deploytool 将matlab的源文件打包成 jar 包并在Java Web 项目中使用
  • 解决在Linux服务器上安装MATLAB Compiler Runtime(MCR)并配置环境变量的问题

遇到的问题

  • 在修改了/etc/profile之后出现错误,导致系统出现异常无法正常进入图像界面
  • 不同版本的MCR目录下的文件不一样,配置方式可能不同,在配置MCR9.1无果并且没有MATLAB R2017a的Linux编译器 所以改装了一个MCR8.1 (MATLAB R2013a)(遇到的第三个问题会解释原因)
  • 百度到的答案都是各种复制,千篇一律都是MATLAB 2012对应的MCR,而且举例都一样,具体过程也语焉不详。。。
  • -

实现的过程以及做过的尝试

首先尝试的是安装MCR9.2 因为本地MATLAB R2017a,按以下步骤安装:
1. 在matlab官网下载对应的压缩包之后解压后再当前解压到的目录进行安装

sudo ./install -mode silent -agreeToLicense yes

第一个问题来了
matlab的安装程序,给出的提示是再LD_LIBRARY_PATH 变量下追加给出的路径信息(会在终端打印出来),讲道理官方给得提示应该不会有问题,然而按照这个步骤做之后java调用编译好的jar包出现了以下问题(StackOverflow上搜索到了相同的问题)

 Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the required library libmwmclmcrrt.so.9.0 on java.library.path.

此处是原文 java.library.path, classpath Netbeans 8.0.2
在搜索相关内容之后,发现是找不到相应的动态连接库,找了一圈(对linux不熟悉)后发现就是要在LD_LIBRARY_PATH所配置的路径,然后检查了以下/etc/profile文件发现确实已经按照官方给的路径配置了,然而并没有什么用,考虑是环境变量没有生效,遂重启系统。
然而第二个问题出来了
开机之后正确输入密码,进不了系统一直在登录界面,查了一些资料之后发现应该是环境变量配置有问题,所以通过Xshell登录查看profile文件,和官方给的提示以及网上各种大佬的简明扼要的教程是一样的,在删除新添加的LD_LIBRARY_PATH 后恢复正常,

此处是什么原因,还不清楚坐等大佬来解答

2.姑且认为是系统抽风了进不去图形界面就用命令行吧,抱有一丝幻想做个demo来测试一下

function test()
x = 1:100;
y = 1:100;
plot(x,1:y);
end
%画一条斜线

在参考了网上相关的教程后,用mcc -mv test.m
第三个问题来了
用windows下的matlab 编译器编译之后生成的是exe文件,不是.sh文件所以换一个linux下的matlab编译器来编译吧,使用matlab R2013a 对应的编译器编译之后把生成的两个文件 run_test.sh 和test.sh 拷贝过来运行

sudo ./test

运行时候提示缺少各种.so的文件,在网上一通狂搜之后发现还是上面提到的动态连接库的问题,因为LD_LIBRARY_PATH变量和在/etc/ld.so.conf文件内添加路径的效果相同,因此将缺少的相应的库的路径加到这个文件中憨厚运行ldconfig命令使之生效。

再次运行之后出现如下错误:
这里写图片描述

没有找到对应版本的MCR,暂时也不知到为什么,所以打开之前编译生成的run_test.sh文件看了代码

# the specified command.
#
exe_name=$0
exe_dir=
dirname “$0”
echo ""
if [ "x$1" = "x" ]; then
echo Usage:
echo $0 \ args
else
echo Setting up environment variables
MCRROOT="$1"
echo ---
LD_LIBRARY_PATH=.:${MCRROOT}/runtime/glnxa64 ;
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MCRROOT}/bin/glnxa64 ;
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MCRROOT}/sys/os/glnxa64;
MCRJRE=${MCRROOT}/sys/java/jre/glnxa64/jre/lib/amd64 ;
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MCRJRE}/native_threads ;
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MCRJRE}/server ;
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MCRJRE}/client ;
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${MCRJRE} ;
XAPPLRESDIR=${MCRROOT}/X11/app-defaults ;
export LD_LIBRARY_PATH;
export XAPPLRESDIR;
echo LD_LIBRARY_PATH is ${LD_LIBRARY_PATH};
shift 1
args=
while [ $# -gt 0 ]; do
token=$1
args="${args} \"${token}\""
shift
done
eval "\"${exe_dir}/test\"" $args
fi
exit

感觉发现了新大陆,可以通过输入参数给出MCR的路径,就可以得到所有的库的路径,尝试一波
关于Linux下安装MATLAB Compiler Runtime(MCR) 所遇到的问题以及解决方法(以Ubuntu 16.04 为例)_第1张图片

然后就成功了
关于Linux下安装MATLAB Compiler Runtime(MCR) 所遇到的问题以及解决方法(以Ubuntu 16.04 为例)_第2张图片
画出了图,在去掉之前在ld.so.conf 文件中添加的so文件路径之后运行,仍然可以,所有证明其实可以不用添加各种环境变量,可以在运行程序时手动给出MCR的路径


至于我最终要实现的java 调用的功能,还没有实验,待续!!!
对于linux不熟练,只是记录下来遇到的问题,希望欢迎大佬们批评指正!!!!


后续

解决的几个问题

1.之前提到的MATLAB给出的环境变量的问题,MATLAB给出的环境变量应该是没有问题的,但是不知道什么原因导致添加了LD_LIBRARY_PATH 后Ubuntu会进不了图形界面。
2. 要实现的功能已经通过其他的方式完成,通过将Matlab的代码打包为Shell脚本,直接调用再处理控制台的输出字符串取出结果。相比之下这种方式比编译成jar包的方式效率更简单不存在Java版本以及依赖冲突的问题。

待解决的问题
  1. Matlab打包的脚本运行时占用内存过多,会被系统杀掉进程。
  2. Ubuntu中添加了动态连接库的环境变量之后,无法进入图形界面。

你可能感兴趣的:(linux)