让 MATLAB Mex 在特定文件夹中搜索库

Make MATLAB Mex search for a library in a particular folder

我创建了一个 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 搜索该特定文件夹?

MacOS 在搜索动态库(== 共享对象)方面的工作方式与其他操作系统不同。需要知道的几件事:

  1. 每个 .dylib 文件都有一个 "install name"。这是一个嵌入在文件中的字符串,告诉 linker 在哪里可以找到它。当您 link 您的 library/executable/MEX-file 到 .dylib 时,"install name" 被存储并在 运行 时用于定位图书馆。也就是说,它不是存储文件的当前位置,而是它报告的应该找到的位置。

  2. "install name"可以以“@rpath”开头,表示相对路径。

  3. link 到 .dylib 的 executable/library/MEX-file 可以指定用于搜索依赖项的替代目录。这相当于 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

有 linker 标志可用于设置正确的安装名称和 rpaths 等,但您也可以使用 install_name_tool program to 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