Matlab安装(LD_LIBRARY_PATH)弄乱了其他库文件

时间:2016-02-03 17:00:08

标签: java python linux matlab amazon-ec2

我正在尝试在Linux机器上安装Matlab,但设置LD_LIBRARY_PATH(根据安装要求)会破坏其他库文件。我不是Linux专家,但我尝试了几件事,但却无法正常工作。我甚至联系了Matlab的支持,将问题提升到开发团队,并且基本上被告知"哈哈糟透了吮吸"。我看到其他一些人在网上遇到过同样的问题,但要么他们的问题从未得到回答,要么他们的问题略有不同,他们的解决方案并不适用于我。

在运行Ubuntu的VM上安装:

我按照说明设置LD_LIBRARY_PATH,然后它会破坏网络文件。我可以ping google.com,但我无法查看google.com或在浏览器中访问它。 Nslookup提供此错误:

nslookup: /usr/local/MATLAB/MATLAB_Runtime/v90/bin/glnxa64/libcrypto.so.1.0.0: no version information available (required by /usr/lib/libdns.so.100)
03-Feb-2016 11:32:22.361 ENGINE_by_id failed (crypto failure)
03-Feb-2016 11:32:22.362 error:25070067:DSO support routines:DSO_load:could not load the shared library:dso_lib.c:244:
03-Feb-2016 11:32:22.363 error:260B6084:engine routines:DYNAMIC_LOAD:dso not found:eng_dyn.c:447:
03-Feb-2016 11:32:22.363 error:2606A074:engine routines:ENGINE_by_id:no such engine:eng_list.c:418:id=gost
(null): dst_lib_init: crypto failure

安装工作正常(我可以运行我的Java程序,引用编译的Matlab函数)。取消设置LD_LIBRARY_PATH会修复网络文件,但我不能再运行程序了。

在EC2实例上安装:

在EC2实例上,它不会破坏网络文件(nslookup很好)。相反,它会弄乱Python库文件。尝试使用任何aws cli命令,我收到错误:

File "/usr/bin/aws", line 19, in <module>
  import awscli.clidriver
File "/usr/lib/python2.7/dist-packages/awscli/clidriver.py", line 16, in <module>
  import botocore.session
File "/usr/lib/python2.7/dist-packages/botocore/session.py", line 25, in <module>
  import botocore.config
File "/usr/lib/python2.7/dist-packages/botocore/config.py", line 18, in <module>
  from botocore.compat import six
File "/usr/lib/python2.7/dist-packages/botocore/compat.py", line 139, in <module>
  import xml.etree.cElementTree
File "/usr/lib64/python2.7/xml/etree/cElementTree.py", line 3, in <module>
  from _elementtree import *
ImportError: PyCapsule_Import could not import module "pyexpat"

在Python中打印sys.path显示lib-dynload已经存在,所以它似乎没有问题。

在尝试运行程序时,我得到:

Exception in thread "main" java.lang.LinkageError: libXt.so.6: cannot open shared object file: No such file or directory
at com.mathworks.toolbox.javabuilder.internal.DynamicLibraryUtils.dlopen(Native Method)
at com.mathworks.toolbox.javabuilder.internal.DynamicLibraryUtils.loadLibraryAndBindNativeMethods(DynamicLibraryUtils.java:134)
at com.mathworks.toolbox.javabuilder.internal.MWMCR.<clinit>(MWMCR.java:1529)
at VectorAddExample.VectorAddExampleMCRFactory.newInstance(VectorAddExampleMCRFactory.java:48)
at VectorAddExample.VectorAddExampleMCRFactory.newInstance(VectorAddExampleMCRFactory.java:59)
at VectorAddExample.VectorAddClass.<init>(VectorAddClass.java:62)
at com.mypackage.Example.main(Example.java:13)

我在砖墙上,真的不知道如何继续。

3 个答案:

答案 0 :(得分:2)

也许其他东西已经需要LD_LIBRARY_PATH设置才能工作。确保你没有覆盖:

export LD_LIBRARY_PATH=new/path:$LD_LIBRARY_PATH

修改

好的,如果LD_LIBRARY_PATH最初为空,这表明Matlab带有与您的系统库不兼容的共享库:

nslookup: /usr/local/MATLAB/MATLAB_Runtime/v90/bin/glnxa64/libcrypto.so.1.0.0: no version information available (required by /usr/lib/libdns.so.100)

建议/usr/lib/libdns.so.100需要libcrypto.so.1.0.0,现在正在解决MATLAB附带的问题,这是不兼容的。

您可以通过

检查dll的依赖关系
ldd /usr/lib/libcrypto.so.1.0.0

希望您能找到一种让MATLAB和您的系统都满意的配置。不幸的是,这可能涉及大量的反复试验。

如果没有这样的配置,只有在运行MATLAB时才能尝试设置LD_LIBRARY_PATH:

LD_LIBRARY_PATH = $ MATLAB_LD_LIBRARY_PATH matlab

编辑2

好吧,对于Python问题,它似乎归结为pyexpat,它是标准expat XML解析器的包装器。尝试做(因为我现在没有Linux,所以猜到了名字):

ldd /usr/local/lib/python2.7/site-packages/libpyexpat.so

看看这取决于什么。可能会是libexpat.so,现在正在解决MATLAB的版本。

答案 1 :(得分:0)

尝试以下命令:

export LD_LIBRARY_PATH=/usr/local/MATLAB/MATLAB_Runtime/v90/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v90/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v90/sys/os‌​/glnxa64:$LD_LIBRARY_PATH

答案 2 :(得分:0)

对OP可能没什么帮助,但是如果你用MATLAB生成一个python包,你可以修改MATLAB为你的包创建的生成的__init__.py文件。

具体来说,生成的__init__.py文件包含以下行(从MATLAB 2017a开始):

PLATFORM_DICT = {'Windows': ['PATH','dll',''], 'Linux': ['LD_LIBRARY_PATH','so','libmw'], 'Darwin': ['DYMCR_LIBRARY_PATH','dylib','libmw']}

对于Linux平台,您只需将LD_LIBRARY_PATH替换为其他内容,例如MCR_LIBRARY_PATH,以防止混淆共享库。

sed -i -e 's/LD_LIBRARY_PATH/MCR_LIBRARY_PATH/g' /MY/PACKAGE/BUILD/PATH/__init__.py 

然后显然在使用python之前导出MCR_LIBRARY_PATH