dyld:未加载库:../ lib / abc.dynlib

时间:2011-12-28 10:27:00

标签: macos xcode4.2

我无法让我的XCode 4.2项目针对动态库(dynlib)运行。

我正在做的是将库添加到xcode项目中,然后使用此lib创建一个新的“Copy Files”构建阶段。

如果我将构建阶段的Destination设置为'Products Directory',那么项目(!)运行良好,但是我必须使用app提供lib而不是嵌入其中。

我在构建阶段的Destination的所有其他设置中得到标题中的错误。

另外,我试图退出xcode,删除构建目录,清理以及所有这些技巧。

我缺少项目/目标设置吗? 为什么XCode在'../lib/'中寻找dynlib? (如错误所示)

3 个答案:

答案 0 :(得分:3)

您有两种选择:a)更改库ID,b)更改最终产品。

ID嵌入在dylib中,它定义了dyld寻找的位置。 ID在链接时从库中获取(当没有使用其他特殊标志时)。您可以使用otool -L进行检查,例如:

gammu:~$ otool -L /usr/lib/libz.dylib 
/usr/lib/libz.dylib:
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)

第一行是dylib的ID。您可以使用install_name_tool -id <path> <library>进行更改。你有一个选择是使用特殊形式@executable_path/...,它从你的二进制文件的位置开始(也有其他的)。

第二个选项(实现相同的目的)是更改产品中库的路径。您可以使用相同的otool -L命令检查它如何链接库:

gammu:~$ otool -L /usr/bin/emacs
/usr/bin/emacs:
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)

然后,您可以使用install_name_tool -change <old> <new> <target>更改库,例如:

install_name_tool -change ../lib/abc.dynlib @executable_path/../lib/abc.dylib foo

最后请注意,如果您让它管理dylib(而不是手动复制它),Xcode通常会自动为您完成所有这些操作。

答案 1 :(得分:2)

我有同样的问题并尝试了第一个解决方案,第一个选项不起作用。仅第二种选择无法解决问题。

而是在dylib的Xode Build设置中将“Dynamic Library Install Name”设置为“<newpath>/<your.dylib>”。 Newpath是您的目标文件foo可以查看的路径,它与您保存dylib的路径相同。在构建dylib并将其用于构建目标文件之后,这些路径将自动放入目标文件中。

您可以使用otool -L确认目标文件和dylib。

答案 2 :(得分:0)

我遇到了同样的问题并以这种方式解决了:

找到丢失的文件:

mdfind libz.1.dylib

就在这里:/Applications/Vagrant/embedded/lib/libz.1.dylib

将其复制到具有超级用户权限的丢失文件夹:

sudo sudo cp /Applications/Vagrant/embedded/lib/libz.1.dylib /usr/lib/libz.1.dylib

完成后,一切正常。