Может ли Xcode создавать статически против старых версий фреймворков? - PullRequest
0 голосов
/ 08 октября 2009

Некоторые файлы MP3 не могут быть открыты CoreAudio в OS X и iPhone OS 3.x.Это была ошибка, которую я отправил в Apple, и она была исправлена ​​в 10.6.2.К сожалению, я все еще должен поддерживать iPhone OS 3.x, поэтому мне нужно проверить эти файлы, которые портят CoreAudio.Я проверяю их с помощью простого инструмента командной строки, который пытается AudioFileOpenURL и возвращает> 0, если есть проблема с его открытием.Если есть, я использую кодировщик Apple iTunes для кодирования MP3 вместо lame.

В настоящее время я не могу перейти на 10.6.2, так как моя программа проверки файлов MP3 теперь будет передавать файлы, которые не будут открываться в iPhone OS 3.x.

Есть ли способ построить инструмент проверки на основе более старой версии AudioToolbox / CoreAudio или другого решения для проверки?

1 Ответ

2 голосов
/ 20 октября 2009

Если я правильно вас понимаю, вы хотите связать код из устаревших системных платформ.

Статическое связывание означало бы, что вы должны разобрать dilib и создать из него статическую библиотеку, что, по меньшей мере, будет трудно сказать.

Но вы можете просто скопировать уязвимые системные платформы из более старой (глючной) системы в оболочку вашего приложения или в другое место рядом с исполняемым файлом. Затем вы связываете свой исполняемый файл с этими фреймворками.

Вы можете использовать терминал, чтобы увидеть, какие библиотеки вы связываете:

$ 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
...