В Xcode, как мне связать динамическую библиотеку (libcurl), чтобы приложение также работало на более старых версиях Mac OS?

Я использую libcurl в проекте Mac, построенном и скомпилированном на OS 10.7 Lion. Я могу просто подключиться к динамической библиотеке, используя опцию -lcurl в других флагах Linker или добавив библиотеку в мой проект. Все работает так, как предполагалось.

Я хочу, чтобы приложение работало и с ОС 10.6 и 10.5. Я настроил целевой объект развертывания соответствующим образом. Когда я запускаю приложение в одной из этих версий ОС, я получаю dyld-ошибку:

Библиотека не загружена:/usr/lib/libcurl.4.dylib Причина: Несовместимая версия библиотеки: X требует версии 7.0.0 или новее, но libcurl.4.dylib предоставляет версию 6.0.0.

Это аналогичная проблема для Mac OS 10.5.

Как я могу связать библиотеку libcurl с системой в Xcode в Mac OS 10.7, чтобы приложение также работало на 10.6 и 10.5?

Я просмотрел пару вариантов:

  • Один из них - изменить базовый SDK, как это предлагается в этом сообщении: Версия для Mac OS X libcurl dylib Если я это сделаю, приложение работает нормально. Но это не вариант для меня. Я должен использовать 10.7 SDK, поэтому регресс на более раннюю версию SDK неприемлем.

  • Я пробовал слабую связь с библиотекой, используя параметр -weak_library/usr/lib/libcurl.dylib в других флагах Linker. Приложение запускается, но затем падает, когда я пытаюсь ссылаться на символы libcurl. Тем не менее, я знаю, что это не проблема с несовместимым кодом, потому что он работает, когда я изменяю базовый SDK.

  • Я пробовал динамически загружать библиотеку в код с помощью dlopen ( "libcurl.dylib", RTLD_LOCAL | RTLD_LAZY); Библиотека загружается, но я должен вручную привязать все символы, которые я ссылаюсь?

Конечно, должен быть способ сделать это. Библиотека libcurl установлена ​​на Mac OS 10.5, 10.6 и 10.7, но приложение не может использовать доступную библиотеку в более старых версиях Mac OS. Как я могу это исправить?

Ответ 1

Некоторые параметры:

  • Переключение с libcurl на API-интерфейсы Mac (CFNetwork, NSURLConnection и т.д.).
  • Создайте и упакуйте свою собственную версию libcurl со своим приложением, а не полагайтесь на системную библиотеку.
  • Скопируйте или символизируйте библиотеку заглушек из SDK, соответствующую цели развертывания, и привяжите к ней явным путем.