Matlab安装(LD_LIBRARY_PATH)破坏了其他库文件

4
我正在尝试在Linux机器上安装Matlab,但设置LD_LIBRARY_PATH(如所需的安装)会破坏其他库文件。我不是一个Linux专家,但我已经尝试了几件事情,但无法正确地解决它。我甚至联系了Matlab支持团队,将问题升级到开发团队,基本上被告知“哈哈难受”。我看到一些其他人在线上也遇到了同样的问题,但他们的问题要么没有得到回答,要么与我的问题略有不同,他们的解决方案并不适用于我。
在运行Ubuntu的虚拟机上安装:
我按照说明设置了LD_LIBRARY_PATH,然后它破坏了网络文件。我可以ping google.com,但我无法nslookup 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

安装成功了(我可以运行引用编译Matlab函数的Java程序)。取消设置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)

我走投无路,真的不知道该怎么办才好。


你是如何设置ld_library_path的? - Adel Ahmed
我曾经手动使用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:,并在.bashrc中设置过。 - mcmcmc
以那种方式使用 export 会删除 ld_library_path 中的先前条目,请检查我的答案。 - Adel Ahmed
3个回答

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的版本。

在设置 LD_LIBRARY_PATH 变量之前,它是空的,因此不会覆盖任何内容。 - mcmcmc
1
我很惊讶Mathworks可以允许他们的库与人们的库发生冲突,而不关心帮助解决它。Ubuntu 14.04并不是什么罕见的未使用的操作系统。无论如何,我认为libXt.so.6错误可以用类似的方式解决。你知道我怎样才能找出Python问题吗?因为Python sys路径似乎是正确的。 - mcmcmc

0

对于楼主可能没有帮助,但如果您正在使用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

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

LD_LIBRARY_PATH在设置之前是空的,因此不会覆盖任何内容。 - mcmcmc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接