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

来源:互联网 发布:淘宝hd版本无法登陆 编辑:程序博客网 时间:2024/05/22 14:52
参照《精通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的下面的这两个目录拷贝过来那

[[i] 本帖最后由 wayd2001 于 2008-7-12 15:06 编辑 [/i]]

 

2008-7-12 15:02wayd2001
因为有些字符会出现表情,所以我家了空格,不知道大家能不能看明白

 

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

 

2008-7-12 16:36sleetdrop
记得Redhat一直喜欢把每个包拆开成runtime的包,一个开发包。
你看看是不是有一个类似qt4-dev的包你没有装。

 

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

 

2008-7-12 20:28bood
回复 #1 wayd2001 的帖子

恩,同意ls

 

2008-7-13 12:28wayd2001
[quote]原帖由 [i]sleetdrop[/i] 于 2008-7-12 16:42 发表[url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8798318&ptid=1196516][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
sorry,看错了,你用vim已经成功了。那个下面的应该是你lib的路径设置问题,在linking 的时候出的错。 [/quote]


关于lib路径的问题,我看了下系统的环境变量,QTINC=/usr/lib/qt-3.3/includeQTLIB=/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:30wayd2001
谢谢上面各位的耐心解答,问题依然存在

 

2008-7-13 17:59水手辛巴
[quote]原帖由 [i]wayd2001[/i] 于 2008-7-13 12:28 发表[url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8801353&ptid=1196516][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]



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

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

 

2008-7-13 19:55err7dd
应该用 -l 指定一下连接的库吧,可以用nm察看一下需要具体连接哪一个库。

 

2008-7-13 23:26mailisall
如果你用gtk你就可以用glade画了,不用这么痛苦地写代码了。

 

2008-7-14 09:33wayd2001
[quote]原帖由 [i]水手辛巴[/i] 于 2008-7-13 17:59 发表[url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8802382&ptid=1196516][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]


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


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

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

是不是qt4就引用了qt3的库

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

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

 

2008-7-14 11:26j1111011
编译器命令:
cc -l库名          [添加链接时要用到的库]

 

2008-7-14 14:31tigerajs
回复 #11 mailisall 的帖子

glade是很好用


页: [1]

原创粉丝点击