Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 使MATLAB Mex在特定文件夹中搜索库_Macos_Matlab_Linker_Mex - Fatal编程技术网

Macos 使MATLAB 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

我创建了一个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
    文件都有一个“安装名称”。这是一个嵌入在文件中的字符串,告诉链接器在哪里可以找到它。将库/可执行文件/MEX文件链接到
    .dylib
    时,将存储“安装名称”,并在运行时使用它来定位库。也就是说,存储的不是文件的当前位置,而是它报告应该在的位置

  • “安装名称”可以以“@rpath”开头,这表示相对路径

  • 链接到
    .dylib
    的可执行/library/MEX文件可以指定搜索依赖项的替代目录。这相当于Linux下的
    rpath
    。这些目录可以是绝对目录,也可以以“@executable\u path”或“@loader\u path”开头,表示相对路径。“@executable_path”是可执行文件的目录(如果是MEX文件,则为MATLAB二进制文件),“@loader_path”是试图加载库的二进制文件的路径(例如,MEX文件)

  • 以下是有关这些主题的更多信息:

    您可以使用链接器标志来设置正确的安装名称和RPATH等,但也可以使用程序来设置。在你的情况下,这可能是最简单的

    在您的情况下,您可以使用类似以下内容来更改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