[Development] About pcre in qt5
Brett Stottlemyer
brett at stottlemyer.com
Sun Jun 10 20:25:27 CEST 2012
> If I add the QT_NO_CURSOR flag, Qt5 won’t compile at all. I’m more concerned about QT_NO_CURSOR not compiling for Qt5.
Here is more detail on the compile errors I am getting:
>From the build log:
cd src\gui\ && "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile
Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe" -f Makefile.Debug all
Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
cl -c -FIqt_gui_pch.h -Yuqt_gui_pch.h -Fptmp\obj\debug_shared\QtGuid_pch.pch -nologo -Zm200 -Zc:wchar_t- -DDEBUG -D_DEBUG -Zi -MDd -W3 -w34100 -w34189 -EHs-c- -GR -DQT_SHARED -DUNDER_CE -DWINCE -D_WINDOWS -D_UNICODE -DUNICODE -D_WIN32 -DQT_NO_PRINTER -DQT_NO_PRINTDIALOG -DQT_NO_NATIVE_GESTURES -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -DQT_NO_CLIPBOARD -D_WIN32_WCE=0x600 -Darmv4i -D_AMRV4I_ -Darmv4i -D_ARM_ -DHAVE_LOCALTIME_S=0 -DQT_NO_CURSOR=1 -DQT_BUILD_GUI_LIB -DQT_NO_USING_NAMESPACE -DQT_MAKEDLL -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -D_USE_MATH_DEFINES -DQT_USE_BUNDLED_LIBPNG -DQT_NO_OPENTYPE -DQT_NO_DIRECTWRITE -DQT_DLL -DQT_CORE_LIB -DQT_NO_EXCEPTIONS -I"..\..\include\QtCore\5.0.0" -I"..\..\include\QtCore\5.0.0\QtCore" -I"..\..\include\QtCore" -I"..\..\include" -I"..\..\include\QtGui\5.0.0" -I"..\..\include\QtGui\5.0.0\QtGui" -I"..\..\include\QtGui" -I"..\..\include" -I"tmp\rcc\debug_shared" -I"c:\_Qt5\src\qtbase\src\gui\tmp" -I"c:\_Qt5\src\qtbase\src\gui\image" -I"c:\_Qt5\src\qtbase\src\3rdparty\libpng" -I"c:\_Qt5\src\qtbase\src\3rdparty\zlib" -I"c:\_Qt5\src\qtbase\src\3rdparty\harfbuzz\src" -I"c:\_Qt5\src\qtbase\src\3rdparty\zlib" -I"tmp\moc\debug_shared" -I"c:\_Qt5\src\qtbase\src\gui" -I"." -I"c:\_Qt5\src\qtbase\mkspecs\wincetest-armv4i-msvc2008" -Fotmp\obj\debug_shared\ @C:\Users\user\AppData\Local\Temp\nm3BCA.tmp
qguivariant.cpp
c:\_qt5\src\qtbase\src\corelib\kernel\qmetatype.h(374) : error C2248: 'QCursor::QCursor' : cannot access private member declared in class 'QCursor'
c:\_qt5\src\qtbase\src\gui\kernel\qcursor.h(70) : see declaration of 'QCursor::QCursor'
c:\_qt5\src\qtbase\src\gui\kernel\qcursor.h(62) : see declaration of 'QCursor'
c:\_Qt5\src\qtbase\src\gui\kernel\qguivariant.cpp(343) : see reference to function template instantiation 'void *qMetaTypeCreateHelper<QCursor>(const void *)' being compiled
c:\_qt5\src\qtbase\src\corelib\kernel\qmetatype.h(402) : error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const QCursor' (or there is no acceptable conversion)
c:\_qt5\jnk\qtbase\include\qtcore\../../../../src/qtbase/src/corelib/tools/qchar.h(389): could be 'QDataStream &operator <<(QDataStream &,QChar)'
c:\_qt5\jnk\qtbase\include\qtcore\../../../../src/qtbase/src/corelib/tools/qbytearray.h(612): or 'QDataStream &operator <<(QDataStream &,const QByteArray &)'
*** Lot's of other candidates ***
c:\_qt5\jnk\qtbase\include\qtcore\../../../../src/qtbase/src/corelib/io/qdatastream.h(163): or 'QDataStream &QDataStream::operator <<(const char *)'
while trying to match the argument list '(QDataStream, const QCursor)'
c:\_Qt5\src\qtbase\src\gui\kernel\qguivariant.cpp(343) : see reference to function template instantiation 'void qMetaTypeSaveHelper<QCursor>(QDataStream &,const void *)' being compiled
c:\_qt5\src\qtbase\src\corelib\kernel\qmetatype.h(410) : error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'QCursor' (or there is no acceptable conversion)
c:\_qt5\jnk\qtbase\include\qtcore\../../../../src/qtbase/src/corelib/tools/qchar.h(390): could be 'QDataStream &operator >>(QDataStream &,QChar &)'
c:\_qt5\jnk\qtbase\include\qtcore\../../../../src/qtbase/src/corelib/tools/qbytearray.h(613): or 'QDataStream &operator >>(QDataStream &,QByteArray &)'
*** Lot's of other candidates ***
c:\_qt5\jnk\qtbase\include\qtcore\../../../../src/qtbase/src/corelib/io/qdatastream.h(150): or 'QDataStream &QDataStream::operator >>(char *&)'
while trying to match the argument list '(QDataStream, QCursor)'
c:\_Qt5\src\qtbase\src\gui\kernel\qguivariant.cpp(343) : see reference to function template instantiation 'void qMetaTypeLoadHelper<QCursor>(QDataStream &,void *)' being compiled
****************************
The line producing the error is in qguivaraint.cpp:
static const QMetaTypeInterface qVariantGuiHelper[] = {
QT_FOR_EACH_STATIC_GUI_CLASS(QT_IMPL_METATYPEINTERFACE_GUI_TYPES)
};
It is using #defines to instantiate templates for each of the types, including QCursor (see qmetatype.h for the defn of QT_FOR_EACH_STATIC_GUI_CLASS)
Now there is the following in qmetatype_p.h:
template<> struct TypeDefinition<QKeySequence> { static const bool IsAvailable = false; };
but there isn’t a template specialization for QCursor with QT_IMPL_METATYPEINTERFACE_GUI_TYPES, so we get all of the above errors.
Here is the define sequence:
#define QT_METATYPE_INTERFACE_INIT(Type) QT_METATYPE_INTERFACE_INIT_IMPL(Type, QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL)
#define QT_METATYPE_INTERFACE_INIT_IMPL(Type, DATASTREAM_DELEGATE) \
{ \
/*creator*/(qMetaTypeCreateHelper<Type>), \
/*deleter*/(qMetaTypeDeleteHelper<Type>), \
DATASTREAM_DELEGATE(Type) \
/*constructor*/(qMetaTypeConstructHelper<Type>), \
/*destructor*/(qMetaTypeDestructHelper<Type>), \
/*size*/(QTypeInfo<Type>::sizeOf), \
/*flags*/QtPrivate::QMetaTypeTypeFlags<Type>::Flags \
}
#ifndef QT_NO_DATASTREAM
# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \
/*saveOp*/(qMetaTypeSaveHelper<Type>), \
/*loadOp*/(qMetaTypeLoadHelper<Type>),
# define QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type) \
/*saveOp*/ 0, \
/*loadOp*/ 0,
#else
# define QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type) \
/*saveOp*/ 0, \
/*loadOp*/ 0,
# define QT_METATYPE_INTERFACE_INIT_DATASTREAM_IMPL(Type) \
QT_METATYPE_INTERFACE_INIT_EMPTY_DATASTREAM_IMPL(Type)
#endif
Based on the above defines, I will get the << and >> errors unless I define QT_NO_DATASTREAM, but even with QT_NO_DATASTREAM defined I will get the “cannot access private member declared in class 'QCursor'” error. To fix that, there either needs to be a public constructor for QCursor (seems like a bad idea), or the qMetaTypeCreateHelper<T> needs to go away.
I tried reaching Suzuki-san at a nokia email address I was able to find, but have not gotten any reply. Because all of these functions are part of the core of Qt (and not a platform plugin) I assume (although I have not tried) QT_NO_CURSOR will fail on all platforms.
I tried creating a 2nd definition of QT_FOR_EACH_STATIC_GUI_CLASS that doesn’t include QCursor if QT_NO_CURSOR is defined, but this is causing a ripple effect of errors based on code assuming at least a minimal implementation. Which leaves modifying the above defines to create a specialization for QCursor and I was hoping someone with more experience could provide some recommendations.
Thanks!
More information about the Development
mailing list