CMake AUTOMOC与qt5_wrap_cpp的比较

r7xajy2e  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(367)

我希望使用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 );                                    \
        }                                                          \
    }

有谁能帮我解开这个谜题吗?先谢谢了。

e0bqpujr

e0bqpujr1#

解决了我失踪了

TARGET ${PROJECT_NAME}

在qt5_wrap_cpp宏的结尾。

相关问题