我创建了一个 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 在如何搜索动态库(== 共享对象)方面与其他操作系统的工作方式不同。有几件事需要知道:
Each .dylib
文件有一个“安装名称”。这是嵌入在文件中的字符串,告诉链接器在哪里可以找到它。当您将库/可执行文件/MEX 文件链接到.dylib
,“安装名称”被存储并在运行时用于定位库。也就是说,它不是存储文件的当前位置,而是它报告的应该找到该文件的位置。
“安装名称”可以以“@rpath”开头,这表示相对路径。
链接到的可执行文件/库/MEX 文件.dylib
可以指定在其中搜索依赖项的替代目录。这相当于rpath
在Linux下。这些目录可以是绝对路径,也可以以“@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 https://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html
您可以使用链接器标志来设置正确的安装名称和 rpath 等,但您也可以使用install_name_tool http://www.manpagez.com/man/1/install_name_tool/编程到链接后更改这些内容 https://matthew-brett.github.io/docosx/mac_runtime_link.html。对于您的情况来说,这可能是最简单的。
在您的情况下,您可以使用类似的方法来更改 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
or
install_name_tool -change /usr/local/lib/libgomp.1.dylib @loader_path/../lib/libgomp.1.dylib mexfile.mexmaci64
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)