让 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 在搜索动态库(== 共享对象)方面的工作方式与其他操作系统不同。需要知道的几件事:
每个 .dylib
文件都有一个 "install name"。这是一个嵌入在文件中的字符串,告诉 linker 在哪里可以找到它。当您 link 您的 library/executable/MEX-file 到 .dylib
时,"install name" 被存储并在 运行 时用于定位图书馆。也就是说,它不是存储文件的当前位置,而是它报告的应该找到的位置。
"install name"可以以“@rpath”开头,表示相对路径。
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
我创建了一个 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 在搜索动态库(== 共享对象)方面的工作方式与其他操作系统不同。需要知道的几件事:
每个
.dylib
文件都有一个 "install name"。这是一个嵌入在文件中的字符串,告诉 linker 在哪里可以找到它。当您 link 您的 library/executable/MEX-file 到.dylib
时,"install name" 被存储并在 运行 时用于定位图书馆。也就是说,它不是存储文件的当前位置,而是它报告的应该找到的位置。"install name"可以以“@rpath”开头,表示相对路径。
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