Macos 使MATLAB Mex在特定文件夹中搜索库
我创建了一个mex函数,它依赖于一个依赖于另一个库的库。当我执行该函数时,它会在运行时输出此错误:Macos 使MATLAB Mex在特定文件夹中搜索库,macos,matlab,linker,mex,Macos,Matlab,Linker,Mex,我创建了一个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
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
文件都有一个“安装名称”。这是一个嵌入在文件中的字符串,告诉链接器在哪里可以找到它。将库/可执行文件/MEX文件链接到.dylib
时,将存储“安装名称”,并在运行时使用它来定位库。也就是说,存储的不是文件的当前位置,而是它报告应该在的位置.dylib
的可执行/library/MEX文件可以指定搜索依赖项的替代目录。这相当于Linux下的rpath
。这些目录可以是绝对目录,也可以以“@executable\u path”或“@loader\u path”开头,表示相对路径。“@executable_path”是可执行文件的目录(如果是MEX文件,则为MATLAB二进制文件),“@loader_path”是试图加载库的二进制文件的路径(例如,MEX文件)install_name_tool -change /usr/local/lib/libgomp.1.dylib usr/local/gfortran/lib/libgomp.1.dylib mexfile.mexmaci64
(用MEX文件名替换mexfile.mexmaci64
)
如果要使用相对路径,例如,如果将依赖的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
或
我知道你的痛苦
DYLD\u LIBRARY\u PATH
在MacOS的最后几次迭代中似乎不再有效。您需要做的是在创建MEX文件时设置一个线性标志,该标志设置文件的rpath
。如果这个问题今晚还在这里,我会试着写一个答案。@CrisLuengo这就是我需要做的:mex LDFLAGS='$LDFLAGS-Wl,-rpath,/usr/local/gfortran/lib'filename.cpp
,看起来像是Linux语法。它与MacOS的工作方式不同,尽管我已经有一段时间没有手动指定RPATH了(CMake为我这样做)。“我需要看一些旧的makefile来记住确切的语法。”我问CrisLuengo,因为它不起作用。编译完成了,但在运行时我仍然看到错误。@CrisLuengo实际上,编译没有完成。上面写着“clang:error:unknown argument:'-rpath,/usr/local/gfortran/lib'”。我从内存和链接的网页中键入了它,但没有测试任何内容。请让我知道是否有错误,以便我可以修复它们。相关答案,但假设您也编译依赖库(即,在链接自己的可执行文件之前正确设置其安装名称):解释得很好!我尝试了install\u name\u tool-change/usr/local/lib/libgomp.1.dylib-usr/local/gfortran/lib/libgomp.1.dylib-mexfile.mexmaci64
,但终端给我无法打开文件:mexfile.mexmaci64(没有这样的文件或目录)
。它位于哪里?啊,对不起,这是您编译的MEX文件的名称。你在问题中没有给出名字,所以我发明了一个…:)我懂了。我不能在MATLAB命令窗口中使用安装\u name\u工具
,可以吗?
install_name_tool -change /usr/local/lib/libgomp.1.dylib @loader_path/../lib/libgomp.1.dylib mexfile.mexmaci64