Xcode 可以静态地针对旧版本的框架构建吗?

Posted

技术标签:

【中文标题】Xcode 可以静态地针对旧版本的框架构建吗?【英文标题】:Can Xcode build against older versions of frameworks, statically? 【发布时间】:2009-10-08 13:15:06 【问题描述】:

CoreAudio 在 OS X 和 iPhone OS 3.x 中无法打开某些 MP3 文件。这是我提交给 Apple 的一个错误,已在 10.6.2 中修复。不幸的是,我仍然必须支持 iPhone OS 3.x,所以我需要测试这些搞砸 CoreAudio 的文件。我使用一个简单的命令行工具检查它们,该工具尝试 AudioFileOpenURL 并在打开它时返回 > 0。如果有我使用 Apple 的 iTunes 编码器来编码 MP3 而不是蹩脚的。

我目前无法升级到 10.6.2,因为我的 MP3 文件检查器现在将传递无法在 iPhone OS 3.x 上打开的文件。

有没有办法针对旧版本的 AudioToolbox/CoreAudio 或其他一些检查解决方案构建检查工具?

【问题讨论】:

【参考方案1】:

如果我理解正确,您希望链接来自过时系统框架的代码。

静态链接意味着您必须将 dylib 拆开并从中创建一个静态库,这至少很难说。

但是您可以将受影响的系统框架从旧的(有缺陷的)系统复制到您的应用程序包装器或靠近可执行文件的其他位置。然后将可执行文件链接到这些框架。

您可以使用终端查看您正在链接的库:

$ cd foo-project/build/Debug
$ otool -L foo
foo:
    /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 123.0.0)

将 mach-o 可执行文件中的加载命令更改为使用链接框架的另一个路径非常容易:

$ install_name_tool -change /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio @executable_path/CoreAudio.framework/Versions/A/CoreAudio foo
$ otool -L foo
foo:
    @executable_path/CoreAudio.framework/Versions/A/CoreAudio (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 123.0.0)

$ DYLD_PRINT_LIBRARIES=1 ./foo
dyld: loaded: /Users/nikolai/foo-project/build/Debug/./foo
dyld: loaded: /Users/nikolai/foo-project/build/Debug/./CoreAudio.framework/Versions/A/CoreAudio
...

您可以准备(复制的)框架,以便在构建 foo 可执行文件时,它会自动具有正确的加载命令:

$ install_name_tool -id @executable_path/CoreAudio.framework/Versions/A/CoreAudio CoreAudio.framework/Versions/Current/CoreAudio

【讨论】:

以上是关于Xcode 可以静态地针对旧版本的框架构建吗?的主要内容,如果未能解决你的问题,请参考以下文章

胖静态库和框架节省?

Xcode 错误地设置为使用旧版构建系统

如何在新的 iOS 7 和 Xcode 5 上使用旧 ios 版本构建我的应用程序

什么是“Swift 语言版本”Xcode 设置?因为它仍然使用旧版本集构建更新的 Swift 代码

对于 React-Native iOS XCode 版本 12.5 的旧项目,构建失败

我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?