dyld:尝试使用NSTask从Objective-C运行Fortran可执行文件时未加载库

dyld:尝试使用NSTask从Objective-C运行Fortran可执行文件时未加载库,objective-c,xcode,macos,cocoa,Objective C,Xcode,Macos,Cocoa,这可能有点不寻常,但我有一个用Fortran编写的程序,它接受一些命令行参数并执行模拟。现在我想添加一个用Xcode编写的GUI来运行可执行文件,并给它一些命令行参数。我使用命令行编译Fortran程序,然后尝试在Xcode中运行它,如下所示: NSString * path = @"path/to/executable"; NSArray * args = [NSArray arrayWithObjects:@"arg1",@"arg2", nil]; [NSTask la

这可能有点不寻常,但我有一个用Fortran编写的程序,它接受一些命令行参数并执行模拟。现在我想添加一个用Xcode编写的GUI来运行可执行文件,并给它一些命令行参数。我使用命令行编译Fortran程序,然后尝试在Xcode中运行它,如下所示:

   NSString * path = @"path/to/executable";
   NSArray * args = [NSArray arrayWithObjects:@"arg1",@"arg2", nil];

   [NSTask launchedTaskWithLaunchPath:path arguments:args] waitUntilExit];
但是,当我运行它时,我得到:
libmkl\u intel\u lp64.dylib dyld:Library未加载。原因:找不到图像。
这些库在my.profile中设置,在命令行中可以正常工作/链接,但在Xcode中无法工作。我甚至试图通过复制.a静态链接它,并用它编译我的程序,但都没有用

根据要求,otool-L的输出:

   lnew-host:$ otool -L /Users/username/Desktop/Simulation/Sim

/Users/username/Desktop/Simulation/Sim:
    libmkl_intel_lp64.dylib (compatibility version 0.0.0, current version 0.0.0)
    libmkl_intel_thread.dylib (compatibility version 0.0.0, current version 0.0.0)
    libmkl_core.dylib (compatibility version 0.0.0, current version 0.0.0)
    libiomp5.dylib (compatibility version 5.0.0, current version 5.0.0)
    /usr/local/lib/libfgsl.0.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

该问题与用于解析
.dylib
路径的机制有关

从命令行运行时,通过设置环境变量
$DYLD\u LIBRARY\u path
解析路径

当通过
NSTask
运行时,您根本没有做任何事情(Xcode不会继承您在
.profile
中设置的环境;事实上,任何未使用
/usr/bin/open
调用的应用程序如何获得其环境是相当复杂的)

解决此问题的最佳长期解决方案是使用
install\u name\u tool
修复每个英特尔库在可执行文件中的位置:

cd /Users/username/Desktop/Simulation
for lib in libmkl_intel_lp64.dylib libmkl_intel_thread.dylib libmkl_core.dylib 
do
    install_name_tool -change $lib /opt/intel/mkl/lib/$lib Sim
done
此更改是永久性的,意味着不再需要使用
$DYLD\u LIBRARY\u PATH
,但是,如果您构建了
Sim
,则在链接它时可以完成所有操作

现在,如果您打算将GUI打包在App Store(甚至是临时发行版)上出售,那么您需要将这些库打包到App bundle中,您还有更多的工作要做。但那是另一个故事,不是吗


一句话:在任何版本的*NIX下,使用
$LD\u LIBRARY\u PATH
$DYLD\u LIBRARY\u PATH
都是一个坏主意(对于Linux使用
/etc/LD.so.conf.d
,对于OSX使用
安装\u name\u工具
).

显示
otool-L/path/to/executable
的输出@trojanfoe我将其添加到我的主要帖子中,我希望看到在可执行文件上运行
otool-L
的结果,而不是
.dylib
(尽管这很有用)。@trojanfoe这就是我所做的(我认为),我跑了-otool-L/path/to/executable@trojanfoe我无意中遗漏了复制/粘贴上的第一行。如果这是你的意思,现在已经修复了。我在实际的可执行Fortran程序上运行了它,而不是在动态库上,这是输出。很高兴知道这一点。我对可执行文件中的每个库都这样做,然后我必须对引用其他库的其中一个库执行同样的操作。我还发现了一个编译器选项——静态英特尔,它静态链接英特尔库。不知道我会用哪一个。