Приложению Qt Mac не удалось создать автономный пакет приложений (сборка Qt Creator)

Я использую Qt Creator 3.6.1 с Qt 5.6.0 (Clang 7.0 (Apple), 64 bit) и столкнулся с некоторыми проблемами при попытке создать пакет приложений для развертывания.

Примечание. Имя приложения называется bibi

  1. Qt Creator успешно сгенерировано bibi.app в папке build-bibi-Desktop_Qt_5_6_0_clang_64bit-Release/
  2. Этому bibi.app не удалось успешно связать Qt с другим Mac
  3. macdeployqt не решает проблему

Ниже приведены подробности:

Снимок экрана с ошибкой при запуске bibi.app на другом Mac:

инструмент

> otool -L build-bibi-Desktop_Qt_5_6_0_clang_64bit-Release/bibi.app/Contents/MacOS/bibi
build-bibi-Desktop_Qt_5_6_0_clang_64bit-Release/bibi.app/Contents/MacOS/bibi:
    @rpath/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.6.0, current version 5.6.0)
    @rpath/QtGui.framework/Versions/5/QtGui (compatibility version 5.6.0, current version 5.6.0)
    @rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.6.0, current version 5.6.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/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

macdeployqt

> which macdeployqt
/Users/<myusername>/Qt/5.6/clang_64/bin/macdeployqt
> macdeployqt bibi.app
> otool -L bibi.app/Contents/MacOS/bibi
bibi.app/Contents/MacOS/bibi:
    @rpath/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.6.0, current version 5.6.0)
    @rpath/QtGui.framework/Versions/5/QtGui (compatibility version 5.6.0, current version 5.6.0)
    @rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.6.0, current version 5.6.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/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

дерево bibi.app

bibi.app
├── Contents
│   ├── Frameworks
│   │   ├── QtCore.framework
│   │   │   ├── QtCore -> Versions/Current/QtCore
│   │   │   ├── Resources -> Versions/Current/Resources
│   │   │   └── Versions
│   │   │       ├── 5
│   │   │       │   ├── QtCore
│   │   │       │   └── Resources
│   │   │       │       └── Info.plist
│   │   │       └── Current -> 5
│   │   ├── QtDBus.framework
│   │   │   ├── QtDBus -> Versions/Current/QtDBus
│   │   │   ├── Resources -> Versions/Current/Resources
│   │   │   └── Versions
│   │   │       ├── 5
│   │   │       │   ├── QtDBus
│   │   │       │   └── Resources
│   │   │       │       └── Info.plist
│   │   │       └── Current -> 5
│   │   ├── QtGui.framework
│   │   │   ├── QtGui -> Versions/Current/QtGui
│   │   │   ├── Resources -> Versions/Current/Resources
│   │   │   └── Versions
│   │   │       ├── 5
│   │   │       │   ├── QtGui
│   │   │       │   └── Resources
│   │   │       │       └── Info.plist
│   │   │       └── Current -> 5
│   │   ├── QtPrintSupport.framework
│   │   │   ├── QtPrintSupport -> Versions/Current/QtPrintSupport
│   │   │   ├── Resources -> Versions/Current/Resources
│   │   │   └── Versions
│   │   │       ├── 5
│   │   │       │   ├── QtPrintSupport
│   │   │       │   └── Resources
│   │   │       │       └── Info.plist
│   │   │       └── Current -> 5
│   │   └── QtWidgets.framework
│   │       ├── QtWidgets -> Versions/Current/QtWidgets
│   │       ├── Resources -> Versions/Current/Resources
│   │       └── Versions
│   │           ├── 5
│   │           │   ├── QtWidgets
│   │           │   └── Resources
│   │           │       └── Info.plist
│   │           └── Current -> 5
│   ├── Info.plist
│   ├── MacOS
│   │   └── bibi
│   ├── PkgInfo
│   ├── PlugIns
│   │   ├── imageformats
│   │   │   ├── libqdds.dylib
│   │   │   ├── libqgif.dylib
│   │   │   ├── libqicns.dylib
│   │   │   ├── libqico.dylib
│   │   │   ├── libqjpeg.dylib
│   │   │   ├── libqtga.dylib
│   │   │   ├── libqtiff.dylib
│   │   │   ├── libqwbmp.dylib
│   │   │   └── libqwebp.dylib
│   │   ├── platforms
│   │   │   └── libqcocoa.dylib
│   │   └── printsupport
│   │       └── libcocoaprintersupport.dylib
│   └── Resources
│       ├── empty.lproj
│       └── qt.conf
└── Icon\r

38 directories, 32 files

Спасибо.

Проблема решена

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

  • otool -L не разрешил @rpath, и я был сбит с толку, так как он всегда возвращал мне один и тот же вывод
  • отсутствие способа проверить, содержит ли пакет уже все фреймворки

Короче говоря, проблему можно решить, используя Скотта otool-rpath, lsof или установив DYLD_PRINT_LIBRARIES и DYLD_PRINT_TO_FILE. И я написал заметку с подробностями здесь.


person Heron Yang    schedule 29.04.2016    source источник


Ответы (1)


Предполагая, что вы использовали qt-unified-max-x64- online.dmg и установил Qt в $HOME/Qt. Вы можете построить свой проект с помощью:

cd MY-QT-PROJECT
QT_BIN_DIR=$HOME/Qt/5.6/clang_64/bin
make clean
$QT_BIN_DIR/qmake -config release
make -j$(getconf NPROCESSORS_ONLN)

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

Посмотрите на RPATH в исполняемом файле Mach-O, спрятанном в комплекте:

otool-rpath ./*.app/Contents/MacOS/*
/Users/user/Qt/5.6/clang_64/lib

Я использую небольшой скрипт otool-rpath, который написал себя здесь для иллюстративных целей.

Этот RPATH плюс имена установки, перечисленные в вашем выводе otool -L выше, заставляют динамический компоновщик, dyld, искать фреймворки Qt под /Users/user/Qt/5.6/clang_64/lib. Таким образом, это НЕ будет работать для пользователей, которые не установили Qt в другое место.

Чтобы изменить это, запустите инструмент Qt macdeployqt:

$QT_BIN_DIR/macdeployqt ./*.app -verbose=3 -always-overwrite -appstore-compliant

См. пример macdeployqt журнала здесь.

macdeployqt создает автономные пакеты приложений. Обратите внимание, как RPATH в исполняемом файле изменился с /Users/user/Qt/5.6/clang_64/lib на @executable_path/../Frameworks:

otool-rpath ./*.app/Contents/MacOS/*
@executable_path/../Frameworks

@executable_path делает очевидную вещь и расширяется на dyld до bibi.app/Contents/MacOS во время выполнения. RPATH в исполняемом файле и имена установки вместе заставляют динамическую компоновку внутри пакета работать во время выполнения.

Дальнейшее чтение

Рекомендации

Ключевые слова: "RPATH", "ИМЯ УСТАНОВКИ", "динамическая привязка Mach-O".

Обратите внимание, что RPATH в ELF имеет немного другую семантику.

person scottt    schedule 04.05.2016