免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6523 | 回复: 16
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-12 14:57 |只看该作者 |倒序浏览
我使用的是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 于 2008-7-12 15:06 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-07-12 15:02 |只看该作者
因为有些字符会出现表情,所以我家了空格,不知道大家能不能看明白

论坛徽章:
0
3 [报告]
发表于 2008-07-12 15:44 |只看该作者
有没有可能是环境变量设置不对啊,我以前也总出错,你要确认你正整个开发环境搭好了

论坛徽章:
0
4 [报告]
发表于 2008-07-12 16:36 |只看该作者
记得Redhat一直喜欢把每个包拆开成runtime的包,一个开发包。
你看看是不是有一个类似qt4-dev的包你没有装。

论坛徽章:
0
5 [报告]
发表于 2008-07-12 16:42 |只看该作者
sorry,看错了,你用vim已经成功了。那个下面的应该是你lib的路径设置问题,在linking 的时候出的错。

论坛徽章:
0
6 [报告]
发表于 2008-07-12 20:28 |只看该作者

回复 #1 wayd2001 的帖子

恩,同意ls

论坛徽章:
0
7 [报告]
发表于 2008-07-13 12:28 |只看该作者
原帖由 sleetdrop 于 2008-7-12 16:42 发表
sorry,看错了,你用vim已经成功了。那个下面的应该是你lib的路径设置问题,在linking 的时候出的错。



关于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的路径应该没有问题阿

论坛徽章:
0
8 [报告]
发表于 2008-07-13 12:30 |只看该作者
谢谢上面各位的耐心解答,问题依然存在

论坛徽章:
0
9 [报告]
发表于 2008-07-13 17:59 |只看该作者
原帖由 wayd2001 于 2008-7-13 12:28 发表



关于lib路径的问题,我看了下系统的环境变量,QTINC=/usr/lib/qt-3.3/include QTLIB=/usr/lib/qt-3.3/lib  于是我查找相应的/usr/lib/qt4目录下面并没有include和lib目录,在Kdevelop中,引用的也是QT3的 ...


连接时,需要你用-l指定连接需要用到的库的。
跟你环境路径设置的路径是有关系,但这只是提供了找到该库的路径,而非指定连接的库吧?
不知道说的正确否。

论坛徽章:
0
10 [报告]
发表于 2008-07-13 19:55 |只看该作者
应该用 -l 指定一下连接的库吧,可以用nm察看一下需要具体连接哪一个库。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP