我在OS X上构建了一个可执行文件(名为demux),但它总是加载失败,我无法找到原因:
$ ./demux
RPATH failed to expanding @rpath/sfeMovie.framework/Versions/2.0/sfeMovie to: @executable_path/sfeMovie.framework/Versions/2.0/sfeMovie
dyld: Library not loaded: @rpath/sfeMovie.framework/Versions/2.0/sfeMovie
Referenced from: …current_dir/./demux
这个框架与可执行文件并列。Otool 显示如下:
$ otool -L sfeMovie.framework/Versions/2.0/sfeMovie
sfeMovie.framework/Versions/2.0/sfeMovie:
@rpath/sfeMovie.framework/Versions/2.0/sfeMovie (compatibility version 2.0.0, current version 2.0.0)
并且:
$ otool -L demux
demux:
@rpath/sfeMovie.framework/Versions/2.0/sfeMovie (compatibility version 2.0.0, current version 2.0.0)
鉴于此,我认为将 @executable_path 添加到可执行文件的运行时搜索路径中,可以使它查找任何框架和库,其相对安装名称仅以 @rpath 为前缀(例如 @rpath/sfeMovie.framework/…),并且这些框架和库紧邻于可执行文件。为了确保运行时搜索路径正确:
$ otool -l demux | grep LC_RPATH -A 2
cmd LC_RPATH
cmdsize 32
path @executable_path (offset 12)
但是这个方法失败了,我不知道为什么。对我来说,@executable_path/sfeMovie.framework/Versions/2.0/sfeMovie 看起来是正确的路径,但它仍然失败了... 是否有误用 @rpath 或 @executable_path 的情况?
@executable_path
(不带“/”)在10.9 El Capitan上运行良好,尽管我可以确认在10.7 Mavericks上你必须使用@exectuable_path/
(我有一个编译到10.7目标的应用程序,在10.9上工作但在10.7上不工作 - 在花费了几个小时找问题后,我发现“/”是问题所在...)感谢 @marc-liyanage! - pawel