这可能有点不寻常,但我有一个用Fortran编写的程序,它接受一些命令行参数并执行模拟。现在,我想添加一个用Xcode编写的GUI来运行可执行文件,并给它一些命令行参数。我使用命令行编译了Fortran程序,然后尝试在Xcode中运行它,如下所示:
NSString * path = @"path/to/executable";
NSArray * args = [NSArray arrayWithObjects:@"arg1",@"arg2", nil];
[NSTask launchedTaskWithLaunchPath:path arguments:args] waitUntilExit];但是,当我运行它时,我得到:libmkl_intel_lp64.dylib dyld: Library not loaded. Reason: image not found. --库是在我的.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)发布于 2014-05-21 08:39:53
该问题涉及用于解决.dylib路径的机制。
当从命令行运行它时,您将通过设置环境变量$DYLD_LIBRARY_PATH来解析路径。
在通过NSTask运行时,您什么也不做(Xcode不会继承您在.profile中设置的环境;实际上,没有使用/usr/bin/open调用的应用程序如何获取其环境相当复杂)。
解决此问题的最佳长期解决方案是使用install_name_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_LIBRARY_PATH,但是如果您构建了Sim,那么在链接它时就可以做到这一切。
现在,如果您打算在App (甚至Ad发行版)上打包您的GUI以供销售,那么您将需要将这些库打包到应用程序包中,并且您还有更多的工作要做才能做到这一点。但那是另一个故事,不是吗。
一句话:在任何版本的*NIX下使用$LD_LIBRARY_PATH或$DYLD_LIBRARY_PATH总是一个坏主意(对于Linux使用/etc/ld.so.conf.d和OSX使用install_name_tool)。
https://stackoverflow.com/questions/23777191
复制相似问题