您的位置:首页 > 编程语言 > Qt开发

参照《精通QT4编程》编写第一个QT程序总是失败

2009-04-21 21:52 459 查看
参照《精通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编写函数:

#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 编辑 ]

2008-7-12 15:02
wayd2001

因为有些字符会出现表情,所以我家了空格,不知道大家能不能看明白

2008-7-12 15:44
nicozhou

有没有可能是环境变量设置不对啊,我以前也总出错,你要确认你正整个开发环境搭好了

2008-7-12 16:36
sleetdrop

记得Redhat一直喜欢把每个包拆开成runtime的包,一个开发包。

你看看是不是有一个类似qt4-dev的包你没有装。

2008-7-12 16:42
sleetdrop

sorry,看错了,你用vim已经成功了。那个下面的应该是你lib的路径设置问题,在linking 的时候出的错。

2008-7-12 20:28
bood

回复 #1 wayd2001 的帖子

恩,同意ls

2008-7-13 12:28
wayd2001

原帖由 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的路径应该没有问题阿

2008-7-13 12:30
wayd2001

谢谢上面各位的耐心解答,问题依然存在

2008-7-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指定连接需要用到的库的。

跟你环境路径设置的路径是有关系,但这只是提供了找到该库的路径,而非指定连接的库吧?

不知道说的正确否。

2008-7-13 19:55
err7dd

应该用 -l 指定一下连接的库吧,可以用nm察看一下需要具体连接哪一个库。

2008-7-13 23:26
mailisall

如果你用gtk你就可以用glade画了,不用这么痛苦地写代码了。

2008-7-14 09:33
wayd2001

原帖由 水手辛巴 于 2008-7-13 17:59 发表


连接时,需要你用-l指定连接需要用到的库的。

跟你环境路径设置的路径是有关系,但这只是提供了找到该库的路径,而非指定连接的库吧?

不知道说的正确否。


你好,你所说的-l 参数,应该是用vim编译时候用到的吧,我用vim不加这个-l,只是将QTDIR和PATH定义为qt4的,就可以成功编译和运行了

可是在kdevelop中,我没有找到可以添加-l 类库的地方阿,而且qt4的目录下面没有include 和 lib目录,仅仅在qt-3.3下有,所以我觉得

是不是qt4就引用了qt3的库

还有,文个弱弱的问题,怎么用-l指定要链接的库阿,是在qmake -l ****这样吗》???

[ 本帖最后由 wayd2001 于 2008-7-14 09:36 编辑 ]

2008-7-14 11:26
j1111011

编译器命令:

cc -l库名 [添加链接时要用到的库]

2008-7-14 14:31
tigerajs

回复 #11 mailisall 的帖子

glade是很好用

页:
[1]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: