Заставить приложение OS X использовать определенный libcurl.dylib - PullRequest
1 голос
/ 20 февраля 2012

Моему приложению требуется 7-я версия libcurl, и он отлично работает на Lion, но версия libcurl.dylib на Snow Leopard не работает (мне нужен префикс * для моих команд * MKD).

Я пробовал разные способы включить Lion-версию libcurl.dylib в свой пакет, в том числе поместить копию в (1) папку приложения, (2) папку «Содержание», (3) папку MacOS и (4) папка Ресурсы, но безуспешно. Даже четыре копии, по одной в каждой папке. (Все еще идет в /usr/lib.)

Я также пытался установить «Пути поиска Runpath» в Xcode 4.2 на «.», Но это не помогло.

Итак, вопрос № 1: как я могу заставить мое приложение на Snow Leopard использовать dylib, который я включаю в пакет? (Установка нового libcurl.dylib не может быть и речи - это приложение собирается в Mac App Store.)

Экспериментально я заменил /usr/lib/libcurl.dylib в своей системе Snow Leopard файлом из Lion, и с этим приложение работало. Поэтому я знаю, что если я смогу заставить приложение использовать эту библиотеку, оно будет работать нормально.

Я также пытался создать статический libcurl.a, который работал (используя configure, make и make install), но при попытке связать с этим приложение все еще ссылалось на dylib. Затем я изменил это имя статической библиотеки на libcurl-static.a, но затем возникли ошибки компоновщика, так как десятки символов не были определены в других библиотеках. Я попытался включить больше dylib в свою сборку, чтобы решить их, но список dylibs, необходимый libcurl, по-видимому, длинный. Я пытался использовать otool, чтобы выяснить, что требуется, но ни один из вариантов не показал мне ничего полезного.

Вопрос № 2: Как статически связать мое приложение с libcurl?

(У меня есть обходной путь для невозможности использования * MKD, который игнорирует ошибку, если каталог уже существует, но включает слишком много дополнительных операций FTP и неэффективен. Мой подход с * MKD работает отлично и быстро .)

Нет необходимости предлагать мне перейти в другую библиотеку FTP, как я уже думал об этом. Не очень хочу, потому что libcurl отлично работает на Lion. Если бы я только мог заставить его использовать библиотеку, которую я отправляю на Snow Leopard.

1 Ответ

0 голосов
/ 20 февраля 2012

1) Вы должны изменить идентификатор библиотеки (перед связыванием) - по умолчанию она будет указывать на /usr/lib/, который находится не там, где вы ее отправляете. См. otool -L:

$ otool -L /usr/lib/libcurl.4.dylib  | head -n 2
/usr/lib/libcurl.4.dylib:
    /usr/lib/libcurl.4.dylib (compatibility version 6.0.0, current version 6.1.0)

Чтобы изменить идентификатор, который вы используете install_name_tool -id new/path/libcurl.4.dylib your/copy/of/libcurl.4.dylib, в частности, вы, вероятно, хотите использовать префикс @executable_path/, который соответствует расположению вашего исполняемого файла. В качестве альтернативы вы можете изменить путь в скомпилированном бинарном файле с помощью install_name_tool -change /usr/lib/libcurl.4.dylib @executable_path/libcurl.4.dylib yourapp

2) Вы устанавливаете статическое связывание, используя имя библиотеки, поэтому вместо -lcurl вы просто используете libcurl.a (с полным путем, если его нет в текущем каталоге) - я настоятельно рекомендую этот путь, так как меньше головных болей.

PS: Я не уверен, что вы можете легально отправить libcurl от Apple (вы можете, я не знаю), - но его очень легко скомпилировать из источников Apple напрямую для SL, что позволяет избежать проблем с Lion.

...