【问题标题】:Make MATLAB Mex search for a library in a particular folder让 MATLAB Mex 在特定文件夹中搜索库
【发布时间】:2018-01-09 22:04:49
【问题描述】:

我创建了一个依赖于另一个库的库的 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 搜索该特定文件夹?

【问题讨论】:

  • 我知道你的痛苦! DYLD_LIBRARY_PATH 似乎在 MacOS 的最后几次迭代中不再有效。您需要做的是在创建 MEX 文件时设置一个衬里标志,该标志设置文件的rpath。如果今晚这个问题仍然存在,我会尝试写一个答案。
  • @CrisLuengo 这是我需要做的吗:mex LDFLAGS='$LDFLAGS -Wl,-rpath,/usr/local/gfortran/lib' filename.cpp
  • 这看起来像 Linux 语法。它与 MacOS 的工作方式不同,尽管我有一段时间没有手动指定 rpaths(CMake 为我做这个)。我需要查看一些旧的 makefile 以记住确切的语法。
  • @CrisLuengo 我问是因为它不起作用。编译通过但在运行时我仍然看到错误。
  • @CrisLuengo 实际上,编译没有通过。它说“clang:错误:未知参数:'-rpath,/usr/local/gfortran/lib'”。

标签: macos matlab linker mex


【解决方案1】:

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

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

  2. “安装名称”可以以“@rpath”开头,表示相对路径。

  3. 链接到.dylib 的可执行文件/库/MEX 文件可以指定搜索依赖项的替代目录。这相当于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

您可以使用链接器标志来设置正确的安装名称和 rpath 等,但您也可以使用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

【讨论】:

  • 我在没有测试任何内容的情况下从内存和链接的网页中输入了这个。如果有错误请告诉我,以便我修复它们。
  • 相关答案,但假设您也编译了依赖库(即在链接自己的可执行文件之前正确设置其安装名称):stackoverflow.com/a/31824839/7328782
  • 解释得很好!我试过install_name_tool -change /usr/local/lib/libgomp.1.dylib usr/local/gfortran/lib/libgomp.1.dylib mexfile.mexmaci64,但终端给了我can't open file: mexfile.mexmaci64 (No such file or directory)。它位于哪里?
  • 啊,抱歉,这是您编译的 MEX 文件的名称。你没有在问题中给出名字,所以我发明了一个...... :)
  • 我明白了。我不能在 MATLAB 命令窗口中使用install_name_tool 可以吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 2011-05-01
相关资源
最近更新 更多