我无法让我的XCode 4.2项目针对动态库(dynlib)运行。
我正在做的是将库添加到xcode项目中,然后使用此lib创建一个新的“Copy Files”构建阶段。
如果我将构建阶段的Destination设置为'Products Directory',那么项目(!)运行良好,但是我必须使用app提供lib而不是嵌入其中。
我在构建阶段的Destination的所有其他设置中得到标题中的错误。
另外,我试图退出xcode,删除构建目录,清理以及所有这些技巧。
我缺少项目/目标设置吗? 为什么XCode在'../lib/'中寻找dynlib? (如错误所示)
答案 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
完成后,一切正常。