• 9196阅读
  • 10回复

用arm-linux-g++编译Qt程序出现问题! [复制链接]

上一主题 下一主题
离线lijasmine
 
只看楼主 倒序阅读 楼主  发表于: 2006-04-20
下面是一个简单的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重新编辑 ]
离线skly22222

只看该作者 1楼 发表于: 2006-04-20
是不是用的库的路径没有设对
离线lijasmine
只看该作者 2楼 发表于: 2006-04-20
httpd: $(OBJECTS)
  $(CXX) $^ $(INCPATH) -o $@//对这一步发现少一些链接库
如果gcc直接编译上面这一步就应该写成:
g++ -o http .obj/httpd.o .obj/httpinfo.o .obj/main.o .obj/moc_httpd.o .obj/moc_httpinfo.o -L/usr/lib/qt-3.1/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm
但是我如果用交叉编译环境写这一句: //关键是这一步怎么写?
arm-linux-g++ -o http .obj/httpd.o .obj/httpinfo.o .obj/main.o .obj/moc_httpd.o .obj/moc_httpinfo.o -L/usr/lib/qt-3.1/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm
又出现错误:
/usr/lib/qt-3.1/lib/libqt-mt.so: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
离线shiroki

只看该作者 3楼 发表于: 2006-04-24
arm-linux-g++ -o http .obj/httpd.o .obj/httpinfo.o .obj/main.o .obj/moc_httpd.o .obj/moc_httpinfo.o -L$QTEDIR/lib -lqte -lm
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线lijasmine
只看该作者 4楼 发表于: 2006-04-24
引用第3楼shiroki2006-04-24 11:56发表的“”:
arm-linux-g++ -o http .obj/httpd.o .obj/httpinfo.o .obj/main.o .obj/moc_httpd.o .obj/moc_httpinfo.o -L$QTEDIR/lib -lqte -lm

按照上面的修改Makefile文件
make编译出现:
/arm/arm-linux/bin/ld: cannot find -lqte//没有找到libqte.so库
collect2: ld returned 1 exit status
make: *** [httpd] Error 1

#find / -name libqte*
/home/zhaoxiao/QT-PACKAGE-2.3.3/qt-2.3.3/lib/libqte.so
/home/zhaoxiao/QT-PACKAGE-2.3.3/qt-2.3.3/lib/libqte.so.2
/home/zhaoxiao/QT-PACKAGE-2.3.3/qt-2.3.3/lib/libqte.so.2.3
/home/zhaoxiao/QT-PACKAGE-2.3.3/qt-2.3.3/lib/libqte.so.2.3.2
而QT-PACKAGE-2.3.3目录是下载的一个应用于嵌入式Linux的图形界面软件包。我把home/zhaoxiao/QT-PACKAGE-2.3.3/qt-2.3.3/lib/libqte*复制到$QTEDIR/lib中还是出现同样的错误!
迷惑中,期待你的回复!Thanks
离线shiroki

只看该作者 5楼 发表于: 2006-04-24
看不出还有什么问题了, 你看看QTEDIR和你的qt-2.3.3是一个目录吗? 是不是qtedir的变量没设?
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线lijasmine
只看该作者 6楼 发表于: 2006-04-25
可能是我自己没有描述清楚,qt-3.1是RH9时光盘自带安装的。
我让QTDIR = /usr/lib/qt-3.1
INCPATH = -I$(QTDIR)/include
CC = arm-linux-gcc
CXX = arm-linux-g++
MOC = $(QTDIR)/bin/moc
所以在$(QTDIR)/lib目录里找不到libqte.so
而/home/zhaoxiao/QT-PACKAGE-2.3.3只是QT-PACKAGE-2.3.3.tar.gz解压到主目录的一个应用于嵌入式Linux的图形界面软件包,我根本没有安装这个嵌入式包。我只是把cp /home/zhaoxiao/QT-PACKAGE-2.3.3/qt-2.3.3/lib/libqte* /usr/lib/qt-3.1了
我想知道的是是不是应该安装Qt/Embedded这个软件包?还有安装嵌入式包会不会和系统的qt-3.1冲突?因为版本不一样一个是qt-3.1另一个是qt-2.3.3!
离线shiroki

只看该作者 7楼 发表于: 2006-04-27
? 简直乱得不能再乱了

为什么要把qte的库cp到x11的qt3的目录里去呢? 这步肯定不对

交叉编译的时候QTDIR应该设到你的qte2目录, libqte就在QTDIR/lib里放着
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线lijasmine
只看该作者 8楼 发表于: 2006-05-07
shiroki版主你好,我可能犯了个极端低级的错误!期待你的指正!
我的目的就是将编译好的Qt程序下载到一个PXA255的目标板中,这个板子中已经有qtopia这个嵌入式软件包了。
我原来的做法一直是:
我安装了交叉编译环境。就只把RH9的开发工具Qt Designer写的Qt程序想通过交叉编译工具编译然后下载到板子中。编译不能成功,如果用-lqte库的话说找不到。
我现在要问的是:
是不是应该在主机上安装Qt/Embedded版本?
我以下列步骤安装qt-embedded-2.3.3-commercial.tar.gz
cd ~/qt-2.3.3
export QTDIR=~/qt-2.3.3
export LD_LIBRARY_PATH=~/qt-2.3.3/lib:$LD_LIBRARY_PATH
./configure -platform linux-arm-g++ //因为目标板的系统是arm-linux
make
可是在make编译后出现下面错误:
make[2]: *** [mocgen.o] Error 1
make[2]: Leaving directory `/home/zhaoxiao/qt-2.3.3/src/moc'
make[1]: *** [src-moc] Error 2
make[1]: Leaving directory `/home/zhaoxiao/qt-2.3.3'
make: *** [init] Error 2
是不是~/qt-2.3.3/src/moc下的mocgen.cpp文件有错误?
问这么弱智的问题希望你不要见笑,可是我真的不知道。由于自己学Linux和Qt,也没有人可以商量。最近看到了这个网站就感觉有希望了!
急切盼望你的回复!
[ 此贴被lijasmine在2006-05-07 22:02重新编辑 ]
离线shiroki

只看该作者 9楼 发表于: 2006-05-11
在host上交叉编译需要有交叉编译好的libqte。 不过可以偷懒,用板子上已经编译好的qte

我看你用的是commercial版本,应该有客服支持吧, 直接找客服多方便
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线lijasmine
只看该作者 10楼 发表于: 2006-05-14
谢谢shiroki版主了!开始没有一点头绪现在我有点思路了!
等有结果后会回来汇报的^_^
快速回复
限100 字节
 
上一个 下一个