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

时间:2009-10-08 13:15:06

标签: iphone xcode core-audio

OS X和iPhone OS 3.x中的CoreAudio无法打开某些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 个答案:

答案 0 :(得分:2)

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

静态链接意味着你必须将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可执行文件中更改load命令以使用链接框架的另一个路径非常容易:

$ 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