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或其他一些检查解决方案构建检查工具?
答案 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