我创建了一个mex函数,它依赖于依赖于另一个库的库。当我执行该函数时,它会在运行时输出此错误:
Invalid MEX-file
...
Library not loaded: /usr/local/lib/libgomp.1.dylib
我的计算机上有这个库,但它位于usr/local/gfortran/lib
所以我尝试了这个:
setenv('DYLD_LIBRARY_PATH', '/usr/local/gfortran/lib');
但这并没有解决问题。我正在使用MacOS Sierra 10.12.6。如何让MATLAB搜索该特定文件夹?
答案 0 :(得分:1)
MacOS在搜索动态库(==共享对象)方面与其他操作系统的工作方式不同。有几点需要了解:
每个.dylib
文件都有一个"安装名称"。这是嵌入在文件中的字符串,告诉链接器在哪里找到它。当您将库/可执行文件/ MEX文件链接到.dylib
时,"安装名称"在运行时存储并使用它来定位库。也就是说,它不是存储文件的当前位置,而是应该在其中找到它报告的位置。
"安装名称"可以从" @ rpath"开始,这表示相对路径。
链接到.dylib
的可执行文件/库/ MEX文件可以指定搜索依赖项的备用目录。这相当于Linux下的rpath
。这些目录可以是绝对的,也可以以" @ executable_path"开头。或" @ loader_path",表示相对路径。 " @ executable_path"是可执行文件的目录(MEX文件中的MATLAB二进制文件)," @ loader_path"是尝试加载库的二进制文件的路径(例如MEX文件)。
以下是有关这些主题的更多信息:https://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html
您可以使用链接器标志来设置正确的安装名称和路径等,但您也可以使用install_name_tool
程序change these things after linking。在您的情况下,这可能是最简单的。
在您的情况下,您可以使用类似的内容来更改MEX文件查找依赖库的位置:
install_name_tool -change /usr/local/lib/libgomp.1.dylib usr/local/gfortran/lib/libgomp.1.dylib mexfile.mexmaci64
(将mexfile.mexmaci64
替换为您的MEX文件的名称)。
如果要使用相对路径,例如,如果将从属libgomp.1.dylib
移动到依赖于MEX文件位置的路径,则可以执行以下操作:
install_name_tool -change /usr/local/lib/libgomp.1.dylib @rpath/libgomp.1.dylib mexfile.mexmaci64
install_name_tool -add_rpath @loader_path/../lib mexfile.mexmaci64
或
install_name_tool -change /usr/local/lib/libgomp.1.dylib @loader_path/../lib/libgomp.1.dylib mexfile.mexmaci64