Macos RPATH无法扩展
我在OS X上构建了一个始终无法加载的可执行文件(名为demux),我无法找到原因:Macos RPATH无法扩展,macos,dyld,rpath,Macos,Dyld,Rpath,我在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/Versi
$ ./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)
以及:
有鉴于此,我认为将@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\u path/sfeMovie.framework/Versions/2.0/sfeMovie看起来像是正确的路径,但它仍然失败……是否存在对@rpath或@executable\u path的任何滥用?
解复用
包含一个@rpath
链接,rpath包含@executable\u path
,但是,“您甚至可以添加一个以@loader\u path
开头的LC\u RPATH
load命令路径,这似乎意味着RPATH中不允许使用@executable\u path
。”
如果demux
直接包含@可执行路径
,而不是间接指向RPATH
,则它将工作
有关血淋淋的详细信息,请参见和
如果这是demux.c
:
#include <stdio.h>
int foo();
int main() {
printf("%d\n", foo());
}
int foo() {
return 42;
}
这是您的Makefile
:
run:
$(MAKE) clean
$(MAKE) demux
cd .. && "$(shell pwd -P)/demux"
demux: demux.o lib/sfeMovie.dylib
cc -o $@ $^
install_name_tool \
-change \
'lib/sfeMovie.dylib' \
'@executable_path/lib/sfeMovie.dylib' \
$@
lib/sfeMovie.dylib: lib/sfeMovie.o
cc -shared -o $@ $<
clean::
rm -f demux *.o lib/*.o lib/*.dylib
运行:
$(使)干净
$(制作)demux
cd.&“$(壳牌pwd-P)/demux”
demux:demux.o lib/sfeMovie.dylib
抄送-o$@$^
安装\u name\u工具\
-改变\
'lib/sfeMovie.dylib'\
“@executable_path/lib/sfeMovie.dylib”\
$@
lib/sfeMovie.dylib:lib/sfeMovie.o
cc-shared-o$@$<
清洁::
rm-f解复用*.o lib/*.o lib/*.dylib
然后
demux
正确加载库,即使当前目录不是包含demux
的目录。但是,如果sfeMovie
引用了大量其他库,那么您可能仍然需要一个RPATH。我可以通过一个快速测试项目重现您的问题。当我添加一个尾随文件时,它已修复斜杠到LD\u运行路径\u搜索路径
build设置
而不是:
@executable_path
你应该试试
@executable_path/
otool-l
的输出现在如下所示:
cmd LC_RPATH
cmdsize 32
path @executable_path/ (offset 12)
通常,您可以在以下位置使用my dyld analyzer脚本检查顶级可执行文件(在本例中为“demux”)
此工具试图忠实地再现
dyld
的解析逻辑。它通常可以提供关于哪些引用不起作用的提示,但在这种情况下,它不会捕获缺少尾随斜杠的问题。我将相应地更新它以匹配dyld
的行为。使用您的方案,用户将被迫放置libr在可执行文件旁边的一个lib目录中。如果他不想这样做,他必须在链接前编辑动态库(或在每个链接步骤后编辑可执行文件)。我忘了给出这一点的精确性:我想让用户选择框架的放置位置,这就是我尝试使用rpath的原因。谢谢:)哦,就是这样!!!非常感谢!!它看起来更像是一个dyld错误,因为它打印了一个有效的扩展路径,但无法加载…无论如何,已解决:)也将查看您的脚本:)Gla我同意,这种行为与文档不符。看起来@executable\u path
(不带“/”)在10.9 El Capitan上运行良好,不过我可以确认,在10.7 Maverick上,您必须使用@executable\u path/
(我已将应用程序编译为10.7目标,在10.9上工作,但在10.7上没有-花了几个小时查找问题后,我发现“/”是问题所在…)谢谢@marc liyanage!
cmd LC_RPATH
cmdsize 32
path @executable_path/ (offset 12)
./checklibs.py demux