下面是一个简单的http实现过程!
//httpd.h
class HttpDaemon : public QServerSocket
{ Q_OBJECT
public:
HttpDaemon( QObject* parent=0 );
void newConnection( int );
……
}
//httpd.cpp
HttpDaemon::HttpDaemon( QObject* parent )
: QServerSocket( 1025,1,parent )
{
if( !ok() )
{
qWarning("Failed to bind to port 1025");
exit(1);
}
}
void HttpDaemon::newConnection(int socket)
{
QSocket *s = new QSocket( this );
connect( s, SIGNAL(readyRead()), this, SLOT(readClient()) );
connect( s, SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) );
s->setSocket( socket );
emit newConnect();
}
//httpinfo.h
class HttpDaemon; //前向声明上面的类
class HttpInfo : public QVBox
{ Q_OBJECT
public:
HttpInfo();
private slots: ……
private:
HttpDaemon *httpd;
};
//httpinfo.cpp
HttpInfo::HttpInfo() : QVBox()
{
httpd = new HttpDaemon( this );
……
}
//main.cpp
int main( int argc, char **argv )
{
QApplication a( argc, argv );
HttpInfo info;
a.setMainWidget( &info );
info.show();
return a.exec();
}
//Makefile内容
OBJECTS = main.o httpd.o httpinfo.o moc_httpd.o moc_httpinfo.o
QTDIR = /usr/lib/qt-3.1
INCPATH = -I$(QTDIR)/mkspecs/default -I$(QTDIR)/include
CC = arm-linux-gcc
CXX = arm-linux-g++
MOC = $(QTDIR)/bin/moc
httpd: $(OBJECTS)
$(CXX) $^ $(INCPATH) -o $@//就是这一步出现很多错误
main.o: main.cpp httpinfo.h httpd.h
$(CXX) -c $< $(INCPATH) -o $@
httpd.o: httpd.cpp httpd.h
$(CXX) -c $< $(INCPATH) -o $@
httpinfo.o: httpinfo.cpp httpinfo.h httpd.h
$(CXX) -c $< $(INCPATH) -o $@
moc_httpd.o: .moc/moc_httpd.cpp httpd.h
$(CXX) -c $< $(INCPATH) -o $@
moc_httpinfo.o: .moc/moc_httpinfo.cpp httpinfo.h httpd.h
$(CXX) -c $< $(INCPATH) -o $@
moc_httpd.cpp: $(MOC) httpd.h
$(MOC) httpd.h -o $@
moc_httpinfo.cpp: $(MOC) httpinfo.h
$(MOC) httpinfo.h -o $@
其他的都能够编译生成main.o httpd.o httpinfo.o moc_httpd.cpp moc_httpinfo.cpp moc_httpd.o moc_httpinfo.o就在arm-linux-g++ main.o httpd.o httpinfo.o moc_httpd.o moc_httpinfo.o -o httpd的时候出现很多错误

下面只是其中的一部分。源代码没有错误因为qmake make之后可以正确执行。
main.o(.rodata+0x10): undefined reference to `QTextStream::fill(int)'
main.o(.rodata+0x18): undefined reference to `QTextStream::precision(int)'
httpd.o: In function `HttpDaemon::HttpDaemon(QObject *)':
httpd.o(.text+0x4c): undefined reference to `QServerSocket::QServerSocket(unsigned short, int, QObject *, char const *)'
httpd.o(.text+0xac): undefined reference to `QServerSocket::ok(void) const'
第二个问题:
newConnection()是QServerSocket类的虚函数。
在HttpDaemon类中重新实现newConnection()函数。
在HttpInfo类中根本没有调用HttpDaemon类中的newConnection(),可是在执行文件中明显看到运行newConnection()函数了!

[ 此贴被XChinux在2006-04-20 17:15重新编辑 ]