Как развернуть приложение Qt в Mac OS X с помощью install_name_tool?

У меня проблемы с упаковкой приложения Qt для Mac OS X.

Я прочитал документацию по Развертыванию приложения в Mac OS X но я все еще не уверен, что делаю не так.

На моем Mac у меня установлен Qt5 на ~ / Qt5.1.0 / 5.1.0 / clang_64 (здесь находятся папки bin / и lib /)

У меня есть приложение Qt под названием "renamer" в ~ / Documents / QtProjects / renamer /.

Используя Qt Creator, я создал окончательную версию своего приложения в ~ / Documents / QtProjects / build-renamer-Desktop_Qt_5otool0_clang_64bit-Release. Итак, первое, что я сделал, это запустил otool в своем приложении:

$ cd ~/Documents/QtProjects/build-renamer-Desktop_Qt
$ cd ~/Documents/QtProjects/build-renamer-Desktop_Qt_5_1_0_clang_64bit-Release
$ install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore "renamer.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore"
$ install_name_tool -id @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui "renamer.app/Contents/Frameworks/QtGui.framework/Versions/5/QtGui"
$ install_name_tool -id @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets "renamer.app/Contents/Frameworks/QtWidgets.framework/Versions/5/QtWidgets"
1_0_clang_64bit-Release $ otool -L renamer.app/Contents/MacOS/renamer

Вот результат:

renamer.app/Contents/MacOS/renamer:
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.1.0, current version 5.1.0)
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtGui.framework/Versions/5/QtGui (compatibility version 5.1.0, current version 5.1.0)
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtCore.framework/Versions/5/QtCore (compatibility version 5.1.0, current version 5.1.0)
    /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

Следующее, что я сделал, - это создал каталог Frameworks внутри моего пакета renamer.app и скопировал фреймворки QtWidgets, QtGui и QtCore в новый каталог:

$ cd ~/Documents/QtProjects/build-renamer-Desktop_Qt
$ cd ~/Documents/QtProjects/build-renamer-Desktop_Qt_5_1_0_clang_64bit-Release
$ install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore "renamer.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore"
$ install_name_tool -id @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui "renamer.app/Contents/Frameworks/QtGui.framework/Versions/5/QtGui"
$ install_name_tool -id @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets "renamer.app/Contents/Frameworks/QtWidgets.framework/Versions/5/QtWidgets"
1_0_clang_64bit-Release $ mkdir renamer.app/Contents/Frameworks $ cp -R ~/Qt5.1.0/5.1.0/clang_64/lib/QtCore.framework renamer.app/Contents/Frameworks $ cp -R ~/Qt5.1.0/5.1.0/clang_64/lib/QtGui.framework renamer.app/Contents/Frameworks $ cp -R ~/Qt5.1.0/5.1.0/clang_64/lib/QtWidgets.framework renamer.app/Contents/Frameworks

Затем я запустил install_name_tool, чтобы установить идентификационные имена для фреймворков QtWidgets, QtGui и QtCore:

$ cd ~/Documents/QtProjects/build-renamer-Desktop_Qt_5_1_0_clang_64bit-Release
$ install_name_tool -id @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore "renamer.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore"
$ install_name_tool -id @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui "renamer.app/Contents/Frameworks/QtGui.framework/Versions/5/QtGui"
$ install_name_tool -id @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets "renamer.app/Contents/Frameworks/QtWidgets.framework/Versions/5/QtWidgets"

Затем я убедился, что приложение знает, где найти библиотеку:

$ cd ~/Documents/QtProjects/build-renamer-Desktop_Qt_5_1_0_clang_64bit-Release
$ install_name_tool -change /../Frameworks/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore "renamer.app/Contents/MacOS/renamer"
$ install_name_tool -change /../Frameworks/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui "renamer.app/Contents/MacOS/renamer"
$ install_name_tool -change /../Frameworks/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets "renamer.app/Contents/MacOS/renamer"

Наконец, поскольку структура QtGui зависит от QtCore, а структура QtWidgets зависит от QtGui / QtCore, я также изменил ссылку для QtGui и QtWidgets:

$ install_name_tool -change /../Frameworks/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore "renamer.app/Contents/Frameworks/QtGui.framework/Versions/5/QtGui"
$ install_name_tool -change /../Frameworks/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui "renamer.app/Contents/Frameworks/QtWidgets.framework/Versions/5/QtWidgets"
$ install_name_tool -change /../Frameworks/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore "renamer.app/Contents/Frameworks/QtWidgets.framework/Versions/5/QtWidgets"

Однако, когда я снова запускаю otool -L renamer.app/Contents/MacOS/renamer, ничего не меняется, и я получаю тот же результат, что и раньше:

renamer.app/Contents/MacOS/renamer:
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.1.0, current version 5.1.0)
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtGui.framework/Versions/5/QtGui (compatibility version 5.1.0, current version 5.1.0)
    /Users/paul/Qt5.1.0//5.1.0/clang_64/lib/QtCore.framework/Versions/5/QtCore (compatibility version 5.1.0, current version 5.1.0)
    /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

Я думал, что запуск otool -L renamer.app/Contents/MacOS/renamer изменит вывод на новые пути Qt, но он все тот же. Я думал, что выполнил все шаги, но это не работает. Я пропустил шаг или сделал что-то не так? Я могу успешно развернуть свою программу в Windows без проблем, но у меня проблемы с Mac. Как я могу сделать так, чтобы при запуске otool отображался только что установленный путь для поиска фреймворка QtCore, QtGui и QtWidgets из моего пакета renamer.app?

Я также пытался использовать macdeployqt для развертывания моего приложения, но мое приложение не работает, когда я переименовываю / удаляю библиотеку Qt, установленную в ~ / Qt5.1.0 / 5.1.0 / clang_64. Я попробовал команды sudo macdeployqt renamer.app в папке моего проекта после добавления / bin в мой PATH. macdeployqt работает нормально, но когда я переименовываю / удаляю Qt, мое приложение больше не запускается. Я также запустил otool после запуска macdeployqt, но результат не изменился. Я думаю, macdeployqt копирует необходимые библиотеки Qt в пакет приложений, но неправильно меняет, где искать библиотеки qt.


person kimbaudi    schedule 28.08.2013    source источник
comment
Сегодня утром я установил Qt 5.1.1 и смог использовать macdeployqt для успешного развертывания моего приложения. Теперь, когда я переименовываю / удаляю Qt, мое приложение по-прежнему работает без проблем.   -  person kimbaudi    schedule 29.08.2013
comment
Я думаю, что install_name_tool точно соответствует строке, поэтому, если вы используете change, но есть даже разница в один символ (и это не имеет значения, если это был путь, как у вас //), тогда это не сработает   -  person Stefano Borini    schedule 03.12.2013


Ответы (1)


Как отметил Стефано в своем комментарии, install_name_tool может быть очень разборчивым! Вы используете путь типа /../Frameworks/QtCore.framework/Versions/5/QtCore при вызове insall_name_tool, в то время как ссылка должна быть /Users/paul/Qt5.10/etc. (точно так, как показано otool -L) Однако с Qt 5.2 использование macdeployqt намного проще :)

person Alienpenguin    schedule 24.06.2014