moc处理cpp文件
在使用qt的时候,常常为了实现的需求将一些类隐藏在cpp中文件实现,而这些类又需要一些qt自己的机制支持如Q_OBJECT宏。于是在编译的时候,很可能出现像undefined reference to vtable for "xxx::xxx"的问题,这其实是由于qt不会自动moc cpp文件。参考qt的文档,发现最简单的方法就是用qmake重新生成makefile文件就可以了。另外就是直接把该类写在.h文件里面在编译。
如果需要自己重新写makefile,qt文档给出了以下的方法
For Q_OBJECT class declarations in header files, here is a useful makefile rule if you only use GNU make:
moc_%.cpp: %.h
moc $(DEFINES) $(INCPATH) $< -o $@
If you want to write portably, you can use individual rules of the following form:
moc_foo.cpp: foo.h
moc $(DEFINES) $(INCPATH) $< -o $@
You must also remember to add moc_foo.cpp to your SOURCES (substitute your favorite name) variable and moc_foo.o or moc_foo.obj to your OBJECTS variable.
Both examples assume that $(DEFINES) and $(INCPATH) expand to the define and include path options that are passed to the C++ compiler. These are required by moc to preprocess the source files.
While we prefer to name our C++ source files .cpp, you can use any other extension, such as .C, .cc, .CC, .cxx, and .c++, if you prefer.
For Q_OBJECT class declarations in implementation (.cpp) files, we suggest a makefile rule like this:
foo.o: foo.moc
foo.moc: foo.cpp
moc $(DEFINES) $(INCPATH) -i $< -o $@
This guarantees that make will run the moc before it compiles foo.cpp. You can then put
#include "foo.moc"
对于.cpp文件里面的Q_OBJECT,我们只需在makefile文件里面添加
foo.o: foo.moc
foo.moc: foo.cpp
moc $(DEFINES) $(INCPATH) -i $< -o $@
这样的规则就可以了,然后在.cpp文件的末尾写上
#include "foo.moc"
这样就能够正确的编译,不过我最推荐的还是用qmake重新生成makefile。
另外,对于qtopia,我们使用qtopiamake重新生成makefile,但是我在qtopiamake的时候出现了一点问题,就是重新编译的时候还是出错,不过如果首先make clean,然后在删除makefile,在使用qtopiamake,然后在make就不会出错。而我在qt下就直接用qmake后make,不会出错。可能是因为qtopiamake并没有删除原来生成的.obj文件的原因吧。