使MATLAB Mex搜索特定文件夹中的库

时间:2018-01-09 22:04:49

标签: 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 Sierra 10.12.6。如何让MATLAB搜索该特定文件夹?

1 个答案:

答案 0 :(得分:1)

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

  1. 每个.dylib文件都有一个"安装名称"。这是嵌入在文件中的字符串,告诉链接器在哪里找到它。当您将库/可执行文件/ MEX文件链接到.dylib时,"安装名称"在运行时存储并使用它来定位库。也就是说,它不是存储文件的当前位置,而是应该在其中找到它报告的位置。

  2. "安装名称"可以从" @ rpath"开始,这表示相对路径。

  3. 链接到.dylib的可执行文件/库/ MEX文件可以指定搜索依赖项的备用目录。这相当于Linux下的rpath。这些目录可以是绝对的,也可以以" @ executable_path"开头。或" @ loader_path",表示相对路径。 " @ executable_path"是可执行文件的目录(MEX文件中的MATLAB二进制文件)," @ loader_path"是尝试加载库的二进制文件的路径(例如MEX文件)。

  4. 以下是有关这些主题的更多信息: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