我希望使用qt5_wrap_cpp(比CMake的AUTOMOC特性快得多),但我有一个问题。在其中一个库中(其他编译良好)使用qt5_wrap_cpp生成的一些moc文件缺少声明。例如,使用AUTOMOC生成的一个include头文件长度接近7kb,而用qt5_cpp_wrap为同一个文件生成的moc只有3kb大小。
Sequences/CMakeFiles/Sequences.dir/Events/SequenceEventFactory.cpp.obj: In function `ZN13SequenceEvent7setNameERK7QString':
C:/Projects/p2/Sequences/Events/SequenceEvent.h:20: undefined reference to `SequenceEvent::nameChanged(QString)'
这只在Windows下用MinGW编译时发生。在Linux下CMake和使用qt5_wrap_cpp编译工作正常。
这是des问题的代码:
# include "../Containers/XmlObject.h"
# include "../sequences_global.h"
# include <QUuid>
class SequenceEvent;
typedef SequenceEvent* ( *CreateSequenceEvent )();
class SEQUENCESSHARED_EXPORT SequenceEvent : public XmlObject
{
Q_OBJECT
PRIVATE_PROPERTY( QUuid, id, id, setId, idChanged )
PROPERTY( QString, name, name, setName, nameChanged )
protected:
explicit SequenceEvent( QObject* parent = nullptr );
};
我正在为PROPERTY使用自定义宏:
# define PROPERTY( type, name, read, write, notify ) \
Q_PROPERTY( type _##name READ read WRITE write NOTIFY notify ) \
private: \
type _##name; \
\
public: \
type read() const \
{ \
return _##name; \
} \
Q_SIGNALS: \
void notify( type name ); \
public slots: \
void write( const type& val ) \
{ \
if ( _##name != val ) \
{ \
_##name = val; \
emit notify( val ); \
} \
}
有谁能帮我解开这个谜题吗?先谢谢了。
1条答案
按热度按时间e0bqpujr1#
解决了我失踪了
在qt5_wrap_cpp宏的结尾。