moc并不能处理所有的C++特性。预编译宏的处理也不够完善。体现在不能够处理其他工程中引入的宏。
比如我在A工程中定义了命名空间宏:
#define NAMESPACE_BEGIN namespace Tpt { \
namespace Wow { \
namespace View {
#define NAMESPACE_END } \
} \
}
在B工程中,我想沿用这个命名空间:
NAMESPACE_BEGIN
class LIB_GEOWORKFLOWUI ClassX_in_ProjB: public BaseClass_in_ProjA
{
Q_OBJECT
public:
ClassX_in_ProjB(ParameterPtr parameter, ActorElementPtr actor, QWidget* parent = 0);
~ClassX_in_ProjB();
}
NAMESPACE_END
按道理,QT创建moc_ClassX_in_ProjB.cpp文件中,类ClassX_in_ProjB是应该带有命名空间的,类似于:
int Tpt::Wow::View::ClassX_in_ProjB::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
但是实际上我发现并没有这样子,而是不带命名空间:
int ClassX_in_ProjB::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
这就会导致一个问题,提示:
error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const *
更多moc缺陷参看这里: