用vs2012 x86编译的Qt5.1.1,assistant无法启动
错误提示如下:
上网找了一下解决办法:
见http://www.hnmade.com/bbs/thread-11011-1-1.html
被这种莫名其妙的问题卡住,很不爽,索性编了一套带调试信息的Release版,调试后,发现问题是出在文件TextEncodingRegistry.cpp中(Qt5Webkit模块): PassOwnPtr<TextCodec> newTextCodec(const TextEncoding& encoding) { MutexLocker lock(encodingRegistryMutex()); ASSERT(textCodecMap); TextCodecFactory factory = textCodecMap->get(encoding.name()); ASSERT(factory.function); return factory.function(encoding, factory.additionalData); } 上面那行红色的代码,encoding.name()的值是"ISO-8859-1",返回的factory却是空的,导致后面调用它的成员函数function时直接Access Violation。 在网上查了一下,发现这个问题早在Qt 4.8.2时就已经存在了,同样的工具链(vs2012 x86),同样的异常代码: https://bugs.webkit.org/show_bug.cgi?id=90008 好像是HashMap的成员函数get的问题,还没有细查,依照上述链接中的解决方案修改就好了: 将函数: static void addToTextCodecMap(const char* name, NewTextCodecFunction function, const void* additionalData) { const char* atomicName = textEncodingNameMap->get(name); ASSERT(atomicName); textCodecMap->add(atomicName, TextCodecFactory(function, additionalData)); } 修改为: static void addToTextCodecMap(const char* name, NewTextCodecFunction function, const void* additionalData) { // const char* atomicName = textEncodingNameMap->get(name); const char* atomicName; TextEncodingNameMap::iterator pos; for (pos = textEncodingNameMap->begin(); pos != textEncodingNameMap->end(); ++pos) { if (strcmp(pos->key, name) == 0) { atomicName = pos->value; break; } } ASSERT(atomicName); textCodecMap->add(atomicName, TextCodecFactory(function, additionalData)); } 将函数: PassOwnPtr<TextCodec> newTextCodec(const TextEncoding& encoding) { MutexLocker lock(encodingRegistryMutex()); ASSERT(textCodecMap); TextCodecFactory factory = textCodecMap->get(encoding.name()); ASSERT(factory.function); return factory.function(encoding, factory.additionalData); } 修改为: PassOwnPtr<TextCodec> newTextCodec(const TextEncoding& encoding) { MutexLocker lock(encodingRegistryMutex()); ASSERT(textCodecMap); // TextCodecFactory factory = textCodecMap->get(encoding.name()); TextCodecFactory factory; TextCodecMap::iterator pos; for (pos = textCodecMap->begin(); pos != textCodecMap->end(); ++pos) { if (strcmp(pos->key, encoding.name()) == 0) { factory = pos->value; break; } } ASSERT(factory.function); return factory.function(encoding, factory.additionalData); } 注:Qt5Webkit的KeyValuePair的键/值使用的是key/value,不是原来的first/second。 |
看来还是要编译webkit