2

在尝试使用 VS2012 编译器构建 Qt5 时,我遇到了另一个障碍。

启用 ICU 时(配置命令行上的“-icu”,以及在 VS2012 中正确构建 ICU 的 32 位版本并正确包含所有 ICU 路径(头文件、.lib 和 .dll)),qtbase\src\corelib\codecs\qtextcodec.cpp返回第 688 行当询问名称为“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 支持似乎是不可能的。

更糟糕的是,因为Webkit依赖于 Qt5 中的 ICU,这意味着Webkit也无法构建。

有人可以告诉我这是否很可能是带有 VS2012 的 Qt5 的错误,还是我在构建环境中设置不正确?

同样有用的是,知道是否有人能够使用启用 ICU 支持的 VS2012 编译器构建 Qt5。

我还在Qt 论坛的相关持续线程中发表了评论

4

1 回答 1

5

Qt 默认使用 UTF-8。假设 ICU 51.2,使用定义为 1 的 U_CHARSET_IS_UTF8 重建 ICU。要么:在 source\common\unicode\platform.h 中 #define 它(参见从第 523 行开始的注释),或者您也可以将其添加到所有 ICU 项目的构建中在 allinone.sln 中(例如右键单击,选择属性,选择 Configuration Properties>C/C++>Preprocessor 并将其添加到 Preprocessor Definitions)。

于 2013-07-12T03:55:04.070 回答