2

VS2012 コンパイラで Qt5 を構築しようとする長い障害の中で、別の問題に遭遇しました。

ICU が有効になっている場合 (configure コマンド ラインで「-icu」を指定し、VS2012 で ICU を適切に 32 ビット ビルドし、すべての ICU パス (ヘッダー、.lib、および .dll) を適切に含める)、Line 688 がqtbase\src\corelib\codecs\qtextcodec.cpp返されます。 「US-ASCII」という名前のコーデックを要求されたときに、NULL コーデック (ICU がコーデックを返さない)。

具体的には:

QTextCodec* QTextCodec::codecForLocale()
{
    QCoreGlobalData *globalData = QCoreGlobalData::instance();
    if (!globalData)
        return 0;

    QTextCodec *codec = globalData->codecForLocale.loadAcquire();
    if (!codec) {
#ifdef QT_USE_ICU

        // THIS BLOCK IS REACHED WHEN ICU IS ENABLED

        textCodecsMutex()->lock();

        // ***
        // The following codec returned is NULL!!!
        //   (Internally, it sets the codec name to "US-ASCII",
        //    and fails to find a codec with this name)
        // ***
        codec = QIcuCodec::defaultCodecUnlocked();

        textCodecsMutex()->unlock();
#else
        // setupLocaleMapper locks as necessary
        codec = setupLocaleMapper();
#endif
    }

    return codec;
}

その後、上記の NULL コーデック変数が ("lrelease.exe" ユーティリティのコードで) 逆参照され、"lrelease.exe" ユーティリティが Qt5 ビルド プロセスの一部として実行され、変換を実行しようとすると、クラッシュします。この NULL 逆参照が原因で、Qt ビルドがエラーで停止します。

上記のQIcuCodec::defaultCodecUnlocked()関数にステップ インすると、コーデック名が に設定されてUS-ASCIIおり、この名前のコーデックが見つからないことがわかります。

したがって、Qt5 の VS2012 コンパイラ 32 ビット ビルドに ICU サポートを含めることは不可能のようです。

さらに悪いことに、WebkitQt5 内の ICU に依存しているため、これWebkitもビルドできません。

これが VS2012 の Qt5 のバグである可能性がかなり高いかどうか、またはビルド環境で適切に設定していないものがあるかどうかを教えてください。

また、ICU サポートが有効になっている VS2012 コンパイラを使用して Qt5 をビルドできた人がいるかどうかを知ることも役に立ちます。

また、Qt フォーラムの関連する進行中のスレッドにコメントを投稿しました。

4

1 に答える 1

5

Qt はデフォルトで UTF-8 を使用します。ICU 51.2 を想定して、U_CHARSET_IS_UTF8 を 1 に定義して ICU をリビルドします。source\common\unicode\platform.h で #define するか (行 523 あたりから始まるコメントを参照)、またはすべての ICU プロジェクトのビルドに追加することもできます。 allinone.sln で (たとえば、右クリックしてプロパティを選択し、[構成プロパティ] > [C/C++] > [プリプロセッサ] を選択して、プリプロセッサ定義に追加します)。

于 2013-07-12T03:55:04.070 に答える