Xcode 在错误路径上持续搜索 dylib

16

这是我的错误:

dyld: Library not loaded: /usr/local/lib/libofa.0.dylib
Referenced from: /sers/david/Projekte/Test/build/Debug/Test.app/Contents/MacOS/Test
Reason: image not found

我已经进行了一些研究,并使用 install_name_tool 更改了 dylib 内部的路径:

davids-macbook:Test david$ otool -L libofa.0.0.0.dylib 
libofa.0.0.0.dylib:
@executable_path/../Frameworks/libofa.0.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)

但是Xcode一直在/usr/lib/中搜索它:

build/Debug/Test.app/Contents/MacOS/Test:
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 15.0.0)
/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
@executable_path/../Frameworks/TagLib.framework/Versions/A/TagLib (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/QTKit.framework/Versions/A/QTKit (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
/System/Library/Frameworks/Quartz.framework/Versions/A/Quartz (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libcurl.4.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/local/lib/libofa.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 103.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 44.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 550.29.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 751.29.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1038.32.0)
有没有办法在Xcode中设置这个?谢谢。
编辑:该库不是一个Xcode项目。它是使用./configure;make进行构建的。

Xcode不会做,链接器会做。 - user142019
6
有没有一种方法可以告诉Xcode去告诉链接器...? - david
3个回答

24

通常我这样做:

  1. 将库的安装目录设置为@rpath。这会将安装名称设置为@rpath/libofa.0.0.0.dylib。如果您自己构建库,则可以在Xcode中设置此选项;否则,请使用install_name_tool进行更改。
  2. 将使用该库的应用程序的运行时搜索路径设置为包含库的目录的位置。例如,如果您将库放在应用程序的框架目录中,则需要将运行时搜索路径设置为@executable_path/../Frameworks(或@loader_path/../Frameworks)。

这篇博客文章这篇文章提供了更详细的解释。


2
嗨David,我有同样的问题,但不知道你所说的“愚蠢的包含设置”是什么意思。你能给个简短的例子吗? - JackPearse
同样,我也遇到了这个问题,并且在谷歌上找不到解决方法。 - Geesu
1
@MottiShneor:这是“-id”选项。 - mipadi
哦,谢谢。现在,“id”代表“安装目录”,而不仅仅是...嗯...id?和苹果一起玩很有趣。 - Motti Shneor
@MottiShneor:不,它是“标识名称”的缩写,正如man页面中所述。 - mipadi
显示剩余4条评论

8

请确保从developer.apple.com安装了命令行工具并将该库添加到您的项目中。在Xcode中运行以下脚本:Targets » Build Phases » Run Script,然后执行:

install_name_tool -id @executable_path/../Frameworks/librayName.dylib "$SRCROOT/librayName.dylib"

注意:在dylib名称之前不需要使用'或""。

1
很好的提示!顺便说一下,对于框架,请使用install_name_tool -id @executable_path/../Frameworks/MyFramework.framework/MyFramework "$SRCROOT/MyFramework.framework/MyFramework"(其中MyFramework是框架的名称)代替。 - Constantino Tsarouhas

4
在寻找解决方案之前,您应该了解MAC中与依赖库“dylib”相关的新内容,与Windows中的依赖库“dll”相比有什么不同。dylib与dll的主要区别在于“安装名称”。安装名称是嵌入到动态库中的路径,指示在运行时找到库的位置。无论您将dylibs复制到哪里,它都将始终指向旧路径(除非不更改安装名称)。您可以使用以下命令了解原始搜索路径(安装名称):otool -L a.dylib(只需将dylib拖放到a.dylib的位置即可)。有关安装名称的更多详细信息,请参阅此link。现在,更改dylib的新位置(“安装名称”)的解决方案就是使用install_name_tool,如下所示:install_name_tool -change *dylb的旧路径* *dylib的新路径*。您可以通过上面已经描述的otool -L命令获取旧路径(即原始路径)。

install_name_tool -change 可以更改 dylib 和可执行文件的搜索路径。

您可以在项目中的 Run script 文件中使用此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接