代码之家  ›  专栏  ›  技术社区  ›  Alastair Stuart

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

  •  0
  • Alastair Stuart  · 技术社区  · 16 年前

    在OS X和iPhone OS 3.x中,一些MP3文件无法被CoreAudio打开。这是我提交给苹果的一个bug,已在10.6.2中修复。不幸的是,我必须仍然支持iphoneOS3.x,所以我需要测试这些文件,它们会破坏coreadio。我用一个简单的命令行工具检查它们,该工具尝试audiofileopenurl,如果打开它有问题,则返回>0。如果有的话,我用苹果的iTunes编码器来编码MP3而不是LAME。

    我现在无法升级到10.6.2版本,因为我的MP3文件检查程序现在将传递iPhoneOS3.x上无法打开的文件。

    是否有任何方法可以根据旧版本的audio工具箱/coreaudio或其他检查解决方案构建检查工具?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Nikolai Ruhe    16 年前

    如果我正确理解您,那么您需要链接来自过时系统框架的代码。

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

    但是,您可以将受影响的系统框架从旧的(bugy)系统复制到应用程序包装器或其他靠近可执行文件的地方。然后将可执行文件与这些框架链接起来。

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

    $ 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