• 11710阅读
  • 21回复

参照《精通QT4编程》编写第一个QT程序总是失败 [复制链接]

上一主题 下一主题
离线wayd2001
 

只看楼主 倒序阅读 楼主  发表于: 2008-07-13
— 本帖被 XChinux 执行加亮操作(2008-07-13) —
我使用的是fedora9操作系统,自带的qt版本是4.3.4,KDEVELOP版本是3.5.1,KDE版本是3.5.9,按照书中第一个例子进行编写练习
首先,我修改了/etc/bashrc文件,加入export QTDIR=/usr/lib/qt4
export PATH=$QTDIR/bin: $PATH
然后source /etc/bashrc启用。
如果不使用kdevelop,用vim编写函数:
#include <QtGui/QApplication>
#include <QtGui/QWidget>
#include <QtGui/QLabel>
#include <QtCore/QTextCodec>
#include <QtGui/QPushButton>
#include <QtGui/QVBoxLayout>
int main(int argc, char* argv[])
{
        QApplication app(argc, argv);
        QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030 "  ) );
        QWidget* pWidget = new QWidget;
        QLabel label(pWidget);
        label.setText(QObject::tr("ͬhello world!"));
        QPushButton* btn = new QPushButton(QObject::tr("关闭  "  ), pWidget);
        QVBoxLayout* layout = new QVBoxLayout;
        layout->addWidget(&label);
        layout->addWidget(btn);
        pWidget->setLayout(layout);
        QObject::connect(btn, SIGNAL(clicked()), pWidget, SLOT(close()));
        pWidget->show();
        return app.exec();
}
然后使用命令:qmake -project
qmake
make成功运行程序!

但是按照书中使用kdevelp的步骤,总是失败,我采取的步骤如下:
1.打开kdevelp,选择工程|新建工程|选择“C++|QMake project|Basic Qt4 Application”,选择存放位置~/qt,输入程序名称hello;
2.设置工程选项中,设置qt4的qmake和Qt设计器的绝对路径:/usr/lib/qt4/bin/qmake和/usr/lib/qt/bin/designer
3.略过版本控制系统和“.h文件的模板”和".cpp的文件模板"选项,点击完成,kdevelop会自动生成一个标准的C++主程序,再次编辑修改上面的hello代码,我是直接将#include <QtGui/QApplication>
#include <QtGui/QWidget>
#include <QtGui/QLabel>
#include <QtCore/QTextCodec>
#include <QtGui/QPushButton>
#include <QtGui/QVBoxLayout>
int main(int argc, char* argv[])
{
        QApplication app(argc, argv);
        QTextCodec::setCodecForTr(QTextCodec::codecForName("gb1803 0 " ) );
        QWidget* pWidget = new QWidget;
        QLabel label(pWidget);
        label.setText(QObject::tr("ͬhello world!"));
        QPushButton* btn = new QPushButton(QObject::tr("关闭 " ), pWidget);
        QVBoxLayout* layout = new QVBoxLayout;
        layout->addWidget(&label);
        layout->addWidget(btn);
        pWidget->setLayout(layout);
        QObject::connect(btn, SIGNAL(clicked()), pWidget, SLOT(close()));
        pWidget->show();
        return app.exec();
}
覆盖掉原来的。
4.然后编辑运行
提示N多错误,如下:cd '/home/szq/qt/he' && LC_MESSAGES="C" LC_CTYPE="C" gmake -k
cd src/ && /usr/lib/qt4/bin/qmake src.pro -unix -o Makefile
cd src/ && gmake -f Makefile
compiling main.cpp (g++)
linking ../bin/he (g++)
main.o: In function `main':
/home/szq/qt/he/src/main.cpp:30: undefined reference to `QApplication: :  Q Application(int&, char**, int)'
/home/szq/qt/he/src/main.cpp:32: undefined reference to `QWidget: : Q Widget(QWidget*, QFlags<Qt::WindowType>)'
/home/szq/qt/he/src/main.cpp:33: undefined reference to `QLabel: : Q Label(QWidget*, QFlags<Qt::WindowType>)'
/home/szq/qt/he/src/main.cpp:34: undefined reference to `QLabel: : s etText(QString const&)'
/home/szq/qt/he/src/main.cpp:35: undefined reference to `QPushButton: : Q PushButton(QString const&, QWidget*)'
/home/szq/qt/he/src/main.cpp:36: undefined reference to `QVBoxLayout:  Q VBoxLayout()'
/home/szq/qt/he/src/main.cpp:37: undefined reference to `QBoxLayout: : a ddWidget(QWidget*, int, QFlags<Qt::AlignmentFlag>)'
/home/szq/qt/he/src/main.cpp:38: undefined reference to `QBoxLayout::addWidget(QWidget*, int, QFlags<Qt::AlignmentFlag>)'
/home/szq/qt/he/src/main.cpp:39: undefined reference to `QWidget::setLayout(QLayout*)'
/home/szq/qt/he/src/main.cpp:42: undefined reference to `QApplication::exec()'
/home/szq/qt/he/src/main.cpp:42: undefined reference to `QLabel::~QLabel()'
/home/szq/qt/he/src/main.cpp:42: undefined reference to `QApplication::~QApplication()'
/home/szq/qt/he/src/main.cpp:42: undefined reference to `QApplication::~QApplication()'
/home/szq/qt/he/src/main.cpp:42: undefined reference to `QLabel::~QLabel()'
collect2: ld returned 1 exit status
gmake[1]: *** [../bin/he] Error 1
gmake[1]: Target `first' not remade because of errors.
gmake: *** [sub-src-make_default] Error 2
gmake: Target `first' not remade because of errors.
*** Exited with status: 2 ***

然后。。两天之后,无论怎么修改,还是这样,快疯了,希望大家指点迷津,感激不尽那!!~

PS:这样的情况,我查了下网上资料,都说到要设置环境变量的问题,但是我已经用export导出了PATH和QTDIR,应该没有问题了
而且网络上有些人不仅仅修改QTDIR和PATH,还有QTINC和QTLIB,定义QTINC=/usr/lib/qt4/include,QTLIB=/usr/lib/qt4/lib
但是我看了下/usr/lib/qt4下面没有include和lib目录,这个是怎么回事阿,但是奇怪的是fedora9自带的qt-3.3的版本中,在/usr/lib/qt-3.3下面就有include和lib这两个目录,很是不明白,为什么qt4下没有,是不是应该把QT-3.3的下面的这两个目录拷贝过来那
离线wayd2001

只看该作者 1楼 发表于: 2008-07-13
关于lib路径的问题,我看了下系统的环境变量,QTINC=/usr/lib/qt-3.3/include QTLIB=/usr/lib/qt-3.3/lib  于是我查找相应的/usr/lib/qt4目录下面并没有include和lib目录,在 Kdevelop中,引用的也是QT3的nclude和lib目录,所以我想是不是qt4.3.4和KDEVELOP 3.5.1用的就是qt3的。

lib的路径应该没有问题阿,不然的话,为什么qt4目录下没有lib和include目录那
离线wayd2001

只看该作者 2楼 发表于: 2008-07-13
有些朋友告诉我,不能使用qt等字眼作为程序存放的根目录,所以我尝试了其他的名字作为目录
结果也是一样的,所以应该也不是这个问题
离线luan_hui
只看该作者 3楼 发表于: 2008-07-14
用qt的人本来就少,坛子里真正解决的问题好像不多。。。。。。。或许高手从来不怎么上这个坛子,也或许高手不热衷于帮忙。。。
离线lzian
只看该作者 4楼 发表于: 2008-07-14
linux的qt和kdevelop不一定能保持一致,你也看到了kdevdlop指向的是3的版本。
qt4的dev需要手动下载安装,用软件管理器
离线wayd2001

只看该作者 5楼 发表于: 2008-07-14
引用第4楼lzian于2008-07-14 09:03发表的  :
linux的qt和kdevelop不一定能保持一致,你也看到了kdevdlop指向的是3的版本。
qt4的dev需要手动下载安装,用软件管理器


呵呵,我尝试下,有结果发给大家
离线wayd2001

只看该作者 6楼 发表于: 2008-07-14
引用第3楼luan_hui于2008-07-14 08:43发表的  :
用qt的人本来就少,坛子里真正解决的问题好像不多。。。。。。。或许高手从来不怎么上这个坛子,也或许高手不热衷于帮忙。。。


呵呵,不要说的那么悲观,可能大家都忙吧
离线wayd2001

只看该作者 7楼 发表于: 2008-07-14
引用第5楼wayd2001于2008-07-14 09:37发表的  :
呵呵,我尝试下,有结果发给大家


郁闷,用yumex一不小心升级成4.3.5了
离线wayd2001

只看该作者 8楼 发表于: 2008-07-14
引用第4楼lzian于2008-07-14 09:03发表的  :
linux的qt和kdevelop不一定能保持一致,你也看到了kdevdlop指向的是3的版本。
qt4的dev需要手动下载安装,用软件管理器


qt4的dev已经下载安装了。。结果依然一样。。

呵呵,大家交流以下,希望别的朋友,别向我一样卡住
离线cherrydou
只看该作者 9楼 发表于: 2008-07-14
在QMake管理器中,找到src点击右键,选择子工程项目,然后在配置中,把X11,Gui等库都勾选上,然后重新编译
离线yybruce
只看该作者 10楼 发表于: 2008-07-14
你的qmake版本是4.X的吗?
我的编译完后用which qmake 还是3.3版本的
离线youngst

只看该作者 11楼 发表于: 2008-07-14
lz编译qt4,为什么在kdevelop指定qt3的include和lib啊?
还有就是fc9自带qt4和qt3?fc9没用过,如果自带qt4,你在安装kde开发工具,安装qt4,路径里不会少include的

yybruce 的问题

你的qmake版本是4.X的吗?
我的编译完后用which qmake 还是3.3版本的

你linux的kde开发工具安装了qt-3.3,linux启动后有脚本会吧qt-3.3/bin路径加到PATH里面
你默认使用qmake所以是qt-3.3的,你要用qt4,需要自己指定qmake的路径
离线tara666
只看该作者 12楼 发表于: 2008-07-15
lz解决了吗?我也遇到这个问题了。。
离线gpj87
只看该作者 13楼 发表于: 2008-07-15
兄弟,被你说中了,我用的是同一本书,也和你完全一样的问题,现在头发都快抓没了阿,兄弟如果找到解决方法了就贴出来阿,还有,我邮箱gpj.1987@yahoo.com.cn,希望能多交流。
[ 此贴被gpj87在2008-07-15 20:17重新编辑 ]
离线greatah
只看该作者 14楼 发表于: 2008-07-17
有人解决了吗?
盼望共享一下。
离线water_wf

只看该作者 15楼 发表于: 2008-07-17
fedora9 的qt4不完全,qt3 有问题,如果自己开发,还是下载一个open source 的 qt4自己编译安装开发,很方便的,你的问题应该是环境设置问题
离线tara666
只看该作者 16楼 发表于: 2008-07-19
我遇到的这个问题和lz的类似,没仔细看是不是完全一样,是这样解决的:
先从网上www.broadview.com.cn上下载了本书所带的代码,
然后修改hello.pro和src.pro文件,是之和下载的代码中对应文件一致,然后再编译就好了。
我觉得是歪打正着吧,可能根本原因不是这样,因为我在编译第二章第一个程序时,还是遇到了类似的问题。
所以根本原因是什么也不知道啊,盼望高人哪
离线tara666
只看该作者 17楼 发表于: 2008-07-19
我用的是fedora5,kdevelop3.5.0,qt-4.3.2,kde版本是3.5.1
离线chinsung

只看该作者 18楼 发表于: 2008-07-19
引用楼主wayd2001于2008-07-13 12:29发表的 参照《精通QT4编程》编写第一个QT程序总是失败 :
我使用的是fedora9操作系统,自带的qt版本是4.3.4,KDEVELOP版本是3.5.1,KDE版本是3.5.9,按照书中第一个例子进行编写练习
首先,我修改了/etc/bashrc文件,加入export QTDIR=/usr/lib/qt4
export PATH=$QTDIR/bin: $PATH
然后source /etc/bashrc启用。
如果不使用kdevelop,用vim编写函数:
.......

同学,最好不要用kdevelop,你说按《精通》一书来做的,但你有没有注意到那本书是推荐用kdevelop4的,正式版还没出来呢。kdevelop3主要还是针对kde3的。我现在在用eclipse+cdt+qt-plugin,用得挺好,建议也试一试。
我没用过kdevelop,但看给出的错误信息,应该是环境变量的问题哈
离线greatah
只看该作者 19楼 发表于: 2008-07-23
找了好几天,终于有点眉目了。
原因在于Qt4的include和lib文件夹内的文件都与Qt3有很大不同:Qt3的include文件夹下就是各种头文件,而Qt4的include文件夹下还多了一层目录;Qt3lib文件夹中的一些库在Qt4中已经不存在了(如libqt-mt.so)。

如果出现了这个问题,建议直接查看Makefile文件,确保 ‘INCPATH = ’行中包括‘-I$(QTDIR)/include/Qt -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui’,  ‘LIBS = ’行中包括‘-L$(QTDIR)/lib’和‘-lQtCore -lQtGui’。其中QTDIR为环境变量,是安装QT4的文件夹。至于是否每个选项都是必须的我还不知道。
以下是我的Makefile文件的一部分:
####### Compiler, tools and options
CC    =    gcc
CXX    =    g++
CFLAGS    =    -pipe -Wall -W -O2 -DNO_DEBUG
CXXFLAGS=    -pipe -Wall -W -O2 -DNO_DEBUG
INCPATH    =    -I$(QTDIR)/include -I$(QTDIR)/include/Qt -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui
LINK    =    g++
LFLAGS    =   
LIBS    =    $(SUBLIBS) -L$(QTDIR)/lib -L/usr/X11R6/lib -lQtCore -lQtGui -lXext -lX11 -lm
MOC    =    $(QTDIR)/bin/moc
UIC    =    $(QTDIR)/bin/uic
TAR    =    tar -cf
GZIP    =    gzip -9f


ps:因为我发现qmake、tmake等不同Makefile工具生成的Makefile差别很大,不同版本之间也有差别,所以建议大家还是直接查看Makefile文件比较好。

我只是个菜鸟,如果有错误,还望大家海涵。
离线mazidao2010
只看该作者 20楼 发表于: 2010-04-07
离线we713we
只看该作者 21楼 发表于: 2012-03-31
这个问题已经解决了,主要是书上的路径有问题,直到./bin,对于而且设置没有讲清楚
快速回复
限100 字节
 
上一个 下一个