我试图创建一个基本的OS X框架,现在我刚刚创建了一个测试框架:TestMacFramework.framework,我试图将它导入到一个全新的OS X应用程序项目。

我已经构建了.framework文件并将其导入到新项目中,框架链接正常,我可以引用我添加到框架构建阶段部分的公共头文件。

然而,当我尝试运行容器应用程序时,我得到以下错误:

dyld: Library not loaded: /Library/Frameworks/TestMacFramework.framework/Versions/A/TestMacFramework
  Referenced from: /Users/samharman/Library/Developer/Xcode/DerivedData/TestMacContainer-dzabuelobzfknafuhmgooqhqrgzl/Build/Products/Debug/TestMacContainer.app/Contents/MacOS/TestMacContainer
  Reason: image not found

在谷歌了一下之后,我意识到我需要在我的容器应用程序构建阶段添加一个复制文件部分,所以我已经这样做了,并像这样设置它…

然而,我仍然得到运行时错误。显然我在这里做错了什么,但是苹果开发者库的资源引用了Xcode 2,所以不是很有帮助!

我错过了什么?

更新:

我可以在构建日志中看到我的TestMacFramework.framework被复制到.app contents/frameworks目录中,但它没有被安装到HD上的Library/ frameworks目录中

更新2:

如果我手动将TestMacFramework.framework复制到Library/Frameworks目录中,构建链接是正确的


当前回答

如果你使用的是Xcode 11,确保你在“目标设置-常规”下的“框架”、“库”和“嵌入内容”中添加了框架。将嵌入状态从-“不嵌入”更改为“嵌入&签名”

其他回答

上面的选项对我来说不可能包括。 我通过指定Runpath搜索路径来解决这个问题

这是在“构建设置”选项卡上。 在“链接”部分。 将“Runpath Search Paths”更改为$(inherited) @executable_path/Frameworks

所以我设法让它工作了,只要你有正确的指令,这很简单。我所寻找的是一个“私有”框架,它存在于App包中,而不是被写入系统库文件夹。

构建框架

添加目标以创建Cocoa Framework 在目标“构建设置”中将“安装目录”配置为“@executable_path/../Frameworks” 构建库,并从存档或产品目录中访问.framework

包括框架

将创建的。framework文件拖到Xcode项目中,确保勾选“复制文件到目录” 在包含应用程序的目标中,添加一个新的“Copy File Build Phase” 将“目标”设置为“框架” 拖入已创建的.framework

我尝试了许多修复,但对我有效的是删除构建方案的构建选项卡中列出的缺失目标。您可以通过打开当前方案的编辑窗口来访问它。

编辑:我的UI测试目标不能正常工作,我找到的解决方案是删除它并重新生成它。

删除派生数据为我保存了它

对我来说,由于某种原因xCode(到目前为止12.5)决定我的通知服务扩展目标不应该有正确的框架路径。我怀疑这发生在我从xCode 12.1更新到12.5之后。

所以我得到了与我的一个内部框架相关的相同错误。要解决这个问题,请执行以下操作:

go to Project's General Tab Select your target (in my case it was Notification Service Extension Target) Make sure that Framework and Libraries section contains your missing framework. I've left it Embed Without Signing in my NSE Target, but it is also was added with Embed & Sign to my primary app target Keep your target selected and switch to Build Settings tab There in a search bar enter LD_RUNPATH_SEARCH_PATHS (make sure that All possible settings will be displayed and not just Basic) You will see Runpath Search Paths and it was empty for me. Add 3 following values there: $(inherited) @executable_path/Frameworks @executable_path/../../Frameworks

这对我很有帮助。