使用VS2012编译器在32位版本的Qt5中支持ICU会导致Qt5构建失败; 因此Webkit也是无法构建的

Dan*_*aum 2 c++ icu qt5 visual-studio-2012

我试图用VS2012编译器构建Qt5,遇到了另一个障碍.

启用ICU时(配置命令行中的"-icu",以及VS2012中正确的32位ICU构建以及所有ICU路径(header,.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;
}
Run Code Online (Sandbox Code Playgroud)

稍后,上面提到的NULL编解码器变量被解除引用(在"lrelease.exe"实用程序的代码中),并且当"lrelease.exe"实用程序作为Qt5构建过程的一部分运行并尝试执行转换时,它会崩溃由于这个NULL取消引用并导致Qt构建因错误而停止.

单步执行上述QIcuCodec::defaultCodecUnlocked()功能会显示编解码器名称已设置为US-ASCII,并且找不到具有此名称的编解码器.

因此,似乎不可能在VS2012编译器的32位Qt5版本中包含ICU支持.

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

有人可以告诉我,如果这可能是Qt5与VS2012的错误,或者我的构建环境中是否有正确的设置?

在使用中,也会知道是否有人能够使用启用了ICU支持的VS2012编译器构建Qt5.

我还在Qt论坛的相关正在进行的帖子中发表了评论.

小智 5

Qt使用UTF-8作为默认值.假设ICU 51.2,重建ICU并将U_CHARSET_IS_UTF8定义为1.要么:#define它在source\common\unicode\platform.h中(请参阅关于第523行左右的注释),或者您也可以将它添加到所有ICU项目的构建中在allinone.sln中(例如,右键单击,选择属性,选择"配置属性">"C/C++">"预处理器"并将其添加到"预处理器定义").