16

5.1rc2Mac OS X 用ののバージョン以降に問題がありQtます (5.1rc1 ではなく、5.1 も影響を受けます)
。アプリをビルドotool -Lし、バイナリ ファイルで を実行して共有ライブラリのパスを確認すると、次のようになります。単なるサンプルです。わかりやすくするために一部を削除しました)

/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 
    (compatibility version 45.0.0, current version 1187.37.0)
/Users/chris/**Qt5.1.0//5.1.0**/clang_64/lib/QtWebKitWidgets.framework/Versions/5/QtWebKitWidgets
    (compatibility version 5.1.0, current version 5.1.0)
/Users/chris/Qt5.1.0//5.1.0/clang_64/lib/QtQuick.framework/Versions/5/QtQuick
    (compatibility version 5.1.0, current version 5.1.0)
/Users/chris/Qt5.1.0//5.1.0/clang_64/lib/QtQml.framework/Versions/5/QtQml
    (compatibility version 5.1.0, current version 5.1.0)
/Users/chris/Qt5.1.0//5.1.0/clang_64/lib/QtNetwork.framework/Versions/5/QtNetwork
    (compatibility version 5.1.0, current version 5.1.0)
/Users/chris/Qt5.1.0//5.1.0/clang_64/lib/QtCore.framework/Versions/5/QtCore
    (compatibility version 5.1.0, current version 5.1.0)
/Users/chris/Qt5.1.0//5.1.0/clang_64/lib/QtGui.framework/Versions/5/QtGui
    (compatibility version 5.1.0, current version 5.1.0)

ご覧のとおり、Qt ライブラリのパスに二重スラッシュがあります。macdeployqt を使用してアプリをデプロイすると、これらのパスはローカル フレームワーク (@executable_path/../Frameworks/...) に変更されません。本当に忌々しい。

これを修正するにはどうすればよいですか? (Qtの再インストール、クリーニング、qmakeの再実行、変更なしで再構築を試みました)

4

9 に答える 9

10

同じ問題があります。次の回避策を適用しました:

プログラムをビルドした後、exe 内のリンクを正しいリンクに変更しました。

install_name_tool -change /Users/username/Qt5.1.0//5.1.0/clang_64/lib/QtQuick.framework/Versions/5/QtQuick  /Users/username/Qt5.1.0/5.1.0/clang_64/lib/QtQuick.framework/Versions/5/QtQuick <YourExecutable>

この回避策の後、macdeployqt は exe 内のすべてのリンクを相対リンクに変更しました。

しかし、私のアプリは壊れました。問題は、すべての画像と QML ファイルをリソースに追加したことです。macdeployqt を実行した後、アプリを実行できません。これを gdb で実行すると、次のエラーが表示されます。

QQmlApplicationEngine failed to load component 
qrc:/qml/main.qml:-1 File not found

Error: Your root item has to be a Window.

そのため、どういうわけか私のすべてのリソースが利用できなくなりました。誰もそれを修正する方法を知っていますか?

qtフォーラムでも議論を始めました

更新、展開方法:

  1. このスクリプトを使用して、動的リンク パス内の二重スラッシュを取り除きます。

    ./fixqt.sh ~/Qt5.1.0/5.1.0/clang_64

  2. このリポジトリから macdeployqt ツールをビルドします。

  3. macdeployqt を実行し、qml ソースで dir を指定します。

    macdeployqt MyApp.app/ -qmldir=../src/qml -dmg

これらの手順の後、QT をインストールせずに、別の OS X システムでアプリケーションを実行することができました。すべての qml ファイルと画像をリソースに追加しました。MyApp.app/Content/MacOS/ 内にコピーされた QtQuick および QtQuick.2 モジュール

それが役に立てば幸い

于 2013-07-11T11:10:43.190 に答える
4

このスレッド:

http://www.qtcentre.org/threads/55277-Qt-5-1-and-Mac-Bug-making-macdeployqt-not-working-properly

このリンクが含まれています:

https://gist.github.com/lasconic/5965542

lasconicによるこのスクリプト(私の作品ではありません):

BIN_FILE=YOURBINARY
for P in `otool -L $BIN_FILE | awk '{print $1}'` 
do 
    if [[ "$P" == *//* ]] 
    then 
        PSLASH=$(echo $P | sed 's,//,/,g')
        install_name_tool -change $P $PSLASH $BIN_FILE
    fi 
done 

QTDIR=$1
for F in `find $QTDIR/lib $QTDIR/plugins $QTDIR/qml  -perm 755 -type f` 
do 
    for P in `otool -L $F | awk '{print $1}'`
    do   
        if [[ "$P" == *//* ]] 
        then 
            PSLASH=$(echo $P | sed 's,//,/,g')
            install_name_tool -change $P $PSLASH $F
        fi 
     done
done

YOURBINARYたとえば、に置き換えるだけですmyapp.app/Contents/MacOS/myapp

そしてQTDIR=$1_QTDIR=/Users/MyName/Qt5.1.0/5.1.0/clang_64

ファイルを myapp.app と同じディレクトリに保存します

そして、それを実行します

sh thankslasconic.sh

その後、実行できます

macdeployqt myapp.app

そしてそれはうまくいくはずです。私にとってはそうでした。そのため、ここに投稿しています。

于 2013-07-11T14:44:37.273 に答える
1

インストーラーのバグだと思います。.../Qt5.1.0//5.1.0/... を参照するすべてのライブラリとツール (インストーラーによってコンパイル/リンクされていますか?) (二重スラッシュ付き)

Mac 用のオンライン インストーラーとオフライン インストーラーを試しましたが、同じ結果が得られました。

バグとして報告しました。 https://bugreports.qt-project.org/browse/QTBUG-32467

于 2013-07-07T12:02:56.147 に答える
0

このサイトを見てください http://www.stringcat.com/company_blog/2013/07/04/failed-to-load-platform-cocoa/ https://subversion.assembla.com/svn/blacktulipconfidence/branches を参照してください/GuiDemoMac/このページの最後にあります。

于 2013-07-08T20:42:48.660 に答える
0

プラグイン フォルダーを libraryPaths に設定する

QStringList paths;
paths.append("folder with plugins"); //can be inside bundle
QApplication::setLibraryPaths(paths);
于 2014-04-27T17:06:03.713 に答える
0

上記のすべてをqt 5.1.1で試しましたが、常にこのクラッシュが発生しました:

QMessageLogger::fatal(char const*, ...) const + 161
QGuiApplicationPrivate::createPlatformIntegration() + 1763
QGuiApplicationPrivate::createEventDispatcher() + 28
QCoreApplication::init() + 101
QCoreApplication::QCoreApplication(QCoreApplicationPrivate&) + 42

そこで、このエリクサー YMMV を作成しました。

1) githubから上記のほぼ動作する macqtdeploy を取得します。

2) この新しい macqtdeploy をビルドします

3) これを mac os x のみの main.cpp に追加します。これにより、qapplication を開始する前に「-platformpluginpath」が argv に追加されます。

int macStart(int argc, char *argv[]) {
    QFileInfo fi(argv[0]);
    QDir plugd(fi.dir());
    plugd.cdUp();
    plugd.cd("PlugIns");
    QString plugins = plugd.absolutePath();
    qDebug() << "PlugIns" << plugins;

    char* argv_sub[argc + 2];
    for (int i = 0; i < argc; ++i) {
        char* temp = (char*) malloc(strlen(argv[i]) + 1);
        strcpy(temp, argv[i]);
        argv_sub[i] = temp;
    }

    char ppp[255];
    strcpy(ppp, "-platformpluginpath");
    argv_sub[argc] = ppp;

    char pathx[2048];
    strcpy(pathx, (char*) plugd.absolutePath().toLocal8Bit().constData());
    argv_sub[argc + 1] = pathx;

    DCApplication app(argc + 2, argv_sub);
    app.startup();
    return app.exec();
}

4) アプリをビルドする

5) アプリで新しい macqtdeploy を実行する

6) 良さ

于 2013-09-28T18:47:08.193 に答える