macdeployqt и сторонние библиотеки - PullRequest
11 голосов
/ 11 мая 2010

У меня есть проект приложения, который зависит от пары общих библиотек, которые я создал сам. Согласно документации Qt 4.6 «Развертывание приложения в Mac OSX»:

Примечание: если вы хотите стороннюю библиотеку быть включенным в ваше заявление расслоение, то вы должны добавить явное запись lib для этой библиотеки на ваш файл приложения .pro. Иначе, инструмент macdeployqt не будет копировать Сторонний .dylib в комплекте.

Я добавил записи lib в файл .pro моего приложения, но библиотеки, которые я написал, не копируются в пакет при выполнении macdeployqt. В моем файле .pro есть следующее:

LIBS += -L../Libraries -lMyLib

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

Есть ли ошибка в macdeployqt или мне нужно что-то еще в моем файле .pro?

Ответы [ 4 ]

16 голосов
/ 14 июля 2011

badcat правильно, что документация Qt 4.6 имеет сильно завышенное представление о том, что возможно с инструментом macdeployqt .

По моему опыту, macdeployqt выполняет только следующие действия:

  1. Скопируйте библиотеки Qt в ваш пакет приложений в каталоге foo.app/Contents/Frameworks/
  2. Настраивает библиотеки ссылок одного двоичного файла, а именно foo.app/Contents/MacOS/foo (должно иметь то же имя, что и комплект приложений, даже если вы упомянули другой двоичный файл в Info.plist)

Таким образом, для всех остальных двоичных файлов и библиотек, которые вы хотите развернуть в своем комплекте приложений, вы должны сделать следующее:

  1. Запустите macdeployqt, чтобы воспользоваться его полезными, но неадекватными преимуществами

    macdeployqt <path_to_your_nascent_app_bundle>/foo.app

  2. Установите дополнительные библиотеки вручную

    cp <original_library_path> foo.app/Contents/Frameworks/<lib_name>

  3. Узнайте, на какие библиотеки ссылается каждый двоичный файл.

    otool -L <binary_file_name>

  4. Измените внутренние пути к библиотекам в ваших двоичных файлах

    install_name_tool -change <original_library_path> @executable_path/../Frameworks/<lib_name> <binary_file_name>

Я написал Perl-скрипт, который автоматизирует эти шаги для моего приложения, но он слишком специфичен для моей конкретной среды, чтобы публиковать здесь.

3 голосов
/ 16 марта 2013

Вам не нужно заботиться о ручном развертывании сторонних библиотек. Я загружаю патч в Qt, который позволяет указать дополнительные пути поиска в библиотеке, чтобы инструмент macdeployqt обнаружил сторонние зависимости: https://codereview.qt -project.org / # изменение, 47906

После этого будет другой коммит, который добавит поддержку для развертывания сторонних библиотек.

1 голос
/ 20 ноября 2010

Вы проверяли пакет .app, чтобы увидеть, действительно ли библиотеки не существуют?

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

Интересно то, что macdeployqt никогда не работает напрямую с файлом .pro. Он просто делает что-то для созданного пакета приложений. И после быстрого взгляда на документацию эта страница документации Qt 4.7 явно доказывает, что я прав:

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

Я бы предположил, что есть ошибка в документации 4.6. Для меня macdeployqt никогда не помещал какие-либо библиотечные файлы в мой комплект (кроме, конечно, Qt *).

В прошлом я много времени проводил с этим материалом и в итоге написал простой маленький (Python) скрипт, который упаковывает все в мой пакет, меняет имена библиотек по мере необходимости и помещает все в файл .dmg с автоматическим присвоением имен.

Возможно, не то, что вы хотели услышать, но это работает. ;)

0 голосов
/ 15 августа 2014

https://github.com/auriamg/macdylibbundler

dylibbundler - небольшая программа для командной строки, цель которой - максимально упростить упаковку .dylibs. Он автоматически определяет, какие dylibs нужны вашей программе, копирует эти библиотеки в комплект приложения и фиксирует их и исполняемый файл, чтобы они были готовы к распространению ... все это с помощью одной команды на teminal! Это также будет работать, если ваша программа использует плагины, которые тоже имеют зависимости.

...