在应用程序包内的 OSX 个框架中创建符号链接

Creating symlinks in OSX frameworks inside app bundle

我需要在 OSX(版本 10.10.1)上的应用程序内的框架中创建符号链接。我在 XCode 之外,因为该应用程序是在 Qt 中开发的。它提供了框架,但它们需要一些修饰才能处理新的代码签名规则。

我调用 "ln -s path_origin path_target_link",显然它有效,链接已创建并且解析到正确的位置。

但是当我对应用程序进行代码设计时,出现错误 "unsealed contents present in the root directory of an embedded framework"

(为了验证我的程序,我从另一个下载的包中复制了一个框架来验证代码签名并且我可以成功签名,当我创建符号链接时我的代码设计方式开始给出错误所以我假设问题是我的符号链接创建)

我尝试了其他方法,结果相同,所以我一定是遗漏了什么。有什么想法吗?

对于案例,它对任何人都有用。在我的例子中,问题是我正在创建带有绝对路径的 links。显然它们应该是相对的:您移动到 ​​link 应该去的目录并创建相对于当前位置的 link。

版本 1 代码签名仅记录 Resources 目录中的文件,忽略其余部分。但是版本 2 默认记录了几乎所有的文件。所以我们必须签署每个框架包的版本和应用程序二进制文件。

确保你的framework bundle结构符合apple的要求。

根据 Apple 的文档,框架包没有 'Contents' 文件夹。相反,每个版本文件夹都有一个 'Resources' 文件夹,其中包含 Info.plist 文件,并且还在顶级框架文件夹中进行符号链接。 Qt5框架在SDK构建后布局不正确,所以这不仅仅是macdeployqt的问题,而是整个框架组装部分的问题。

所以请确认,您的应用程序包中没有错误的布局。

如果您的 Qt 框架包中有 *.prl (i.e.QtCore.framework/QtCore.prl)。 *.prl 文件可能会给您带来麻烦,因为 codesign 只是使用 "unsealed content presents in the root directory of an embedded framework" 来解决问题,而没有确切说明发生了什么。如果你有 prl 文件,请删除。

Info.plist 必须具有正确的 CFBundleExecutable 字段。目前还没有。 Info.plist 的 debug 版本会覆盖 release 版本,并且它也恰好包含无效数据。特别是,CFBundleExecutable 将包含 _debug 后缀的库名称,这是不应该的。如果你有这个问题那么修改不正确的info.plist。

最后一步是您必须在对整个应用程序包进行签名之前对所有框架进行代码签名。