版权声明
本文为原创作品,请尊重作者的劳动成果。转载必须保持文章完整性,并以超链接形式注明原始作者“ tingsking18 ”和 主站点 地址,方便其他朋友提问和指正。
fedora core4 下安装 Qt4.5
虽然 fedora core4 、 redhat 9 、 redhat Enterprise 3 等等古老的 linux 的发行版内置了 Qt ,但是 Qt 的版本只是 Qt3 ,可以让我们使用 Qt 来进行开发。但是这也带来了很多问题。
1. Qt3 的版权问题。 Qt 在 4.5 版本以后才使用了 GPL 和 LGPL 双重许可,在 Qt4.5 以前版本的 Qt 都是要购买许可的。
2. Qt4 的新功能。 Qt4 相对于 Qt3 修改了大量的 API ,增加了大量的功能和控件。使开发更加方便和快捷。当你从 Qt4 突然转到 Qt3 的时候,你写起代码来就会畏首畏尾,而且有些本来很简单的东西到 Qt3 下会不支持,或者需要重新自己实现。这也无疑大大增加了开发的难度。尽管 Qt4 提供了向下兼容的 qt3support ,然而使用这个库或者是 Qt3 开发美观的界面程序也是相当的不容易。
所以我们要抛弃 Qt3 ,坚决使用 Qt4 。下面我就将我在 fedora core4 上使用 Qt4 的过程和经验总结一下,希望能对大家有所帮助。其他像 redhat9 和 rhel3 下的方法和 fc4 下的方法基本一样。
起初,在 fedora core4 上使用 Qt4 ,我想到了两个办法:
1. 因为 Qt3 和 Qt4 在 API 上有很大的差异,所以说在这两个版本间实现代码的复用是不可能的。于是乎,我想到将 Qt4 开发的应用程序的代码在高版本的 Linux 发行版上编译,然后拿到二进制文件,放到低版本的 Linux 上,并把二进制文件依赖的库也一起带着。实践证明这是一个非常愚蠢的想法。 Qt4 的程序依赖的 C++ runtime 和 C runtime 的版本差别页很大,要运行这个二进制文件必须要升级 c/c++ runtime 版本才可以 . ,而整个 Linux 又是运行在 c runtime 之上,所以说,这条路根本行不通。
2. 于是有了第二种想法,将界面程序用 Qt4 来编写,然后编译成一个动态库,再到 Qt3 下写一个应用程序来调用这个动态库的函数来显示界面。又经过一番实验,证明这条路还是走不通。除了上面的原因,还有 Qt3 根本无法调用 Qt4 的动态库。因为这两个版本的 Qt 的内部机制存在非常大的差别。两个版本无法整合到一起。
3. 在我安装 qtsdk 的过程中,突然有了第三种想法,就是在这些骨灰级的 Linux 发行版上来编译 Qt4 的源代码。这样就得到了可以适用于这些 Linux 系统的 Qt 的 Library 。这样就不存在 c runtime 版本兼容的问题了。
下面就开始描述一下我在 fedora core4 上安装 Qt4.5 的过程。
1 在安装系统的时候要选择安装 gtk+2.0 主题引擎、 gtk+ 主题引擎。或者装好系统后,在添加删除程序中添加这两个软件包。如果不装这两个软件包,一些控件的效果是显示不出来的。比方说像 qlineargradient 效果的 background-image 有的控件就显示不出来。像 QTabWidget 中的 Tab 切换的背景效果也不支持:
QTabWidget#tabWidget>QTabBar::tab:selected {
color:rgb(36,41, 106);
background-image: url(:/img/image/2_1.png);
}
QTabWidget#tabWidget>QTabBar::tab:!selected {
color: white;
background-image: url(:/img/image/2.png);
}
Qt 是通过 style 这种方式来渲染不同系统的界面风格的,像在 Linux 下是使用的 GTKStyle 而在 win 下也是使用相应的 style ,而 wxWidget 库在 win 下则是调用了 nativeAPI ,在 Linux 下也是封装的 gtk 。
2. 来看一下 gcc 的版本和内核版本:
[root@localhost ~]# gcc -v
使用内建 specs 。
目标: i386-redhat-linux
配置为: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,java,f95,ada --enable-java-awt=gtk --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --host=i386-redhat-linux
线程模型: posix
gcc 版本 4.0.0 20050519 (Red Hat 4.0.0-8)
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.11-1.1369_FC4 #1 Thu Jun 2 22:55:56 EDT 2005 i686 i686 i386 GNU/Linux
还好 gcc 的版本是 4.0 ,编译 Qt4.5 的源代码必须使用 gcc4.0 以上的版本,如果用 rhel3 和 redhat9 ,则需要升级 gcc ,具体的升级方法参考我的博文: 安装 gcc-4.1.0
3. 下载 qt 的源代码,准备编译。我们可以直接下载 Qt 的 source ,而我则是使用的 qtsdk ,虽然是叫做 qtsdk ,但是安装了之后是不能运行的。只是利用他安装后的 qt 的源代码而已。下载 qt-sdk-linux-x86-opensource-2009.02.bin ,安装,默认安装位置设置为 :
/opt/qtsdk ,安装到最后在打 pack 会出现错误,我们不去理会他。
4. 设置环境变量
QTDIR=/opt/qtsdk/qt
PATH=$QTDIR/bin:$PATH
LD_LIBRARY_PATH=/$QTDIR/lib:$LD_LIBRARY_PATH
QMAKESPEC=linux-g++
export QTDIR LD_LIBRARY_PATH QMAKESPEC
5. 删除掉 $QTDIR/qt/bin 下所有文件。然后编译我们必须的几个 qt 的文件。
cd $QTDIR
./configure
cd $QTDIR/qmake/
make & make install
cd $QTDIR/src/tools/bootstrap
make & make install
cd $QTDIR/src/tools/moc
make & make install
cd $QTDIR/src/tools/rcc
make & make install
cd $QTDIR/src/tools/uic
make & make install
cp $QTDIR/ mkspecs /usr/local/Trolltech/Qt-4.5.1/mkspecs
6. 编译 QtCore 和 QtGui
cd $QTDIR/src/corelib
vi Makefile 在 DEFINES 前面添加 -DQT_NO_INOTIFY
make & make install
cd $QTDIR/src/gui
vi Makefile 在 DEFINES 添加 -DQT_NO_XFIXES
在 INCPATH 添加 -I/usr/include/gtk-2.0
在 LIBS 添加 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangoxft-1.0 -lpangox-1.0 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0
make & make install
安装的时候会出错,说找不到 gtk/gtk.h 。说明我们 gtk 库还没有安装成功。
下载 atk-1.10.1.tar.bz2 和 pango-1.10.0.tar.gz
tar jxf atk-1.10.1.tar.bz2
cd atk-1.10.1
./configure
make & make install
tar zxf pango-1.10.0.tar.gz
cd pango-1.10.0
./configure --with-x
make & make install
可以用 echo $? 来查询安装是否成功,若返回 0 表示成功,其他表示错误。
要让 pango 和 atk 的头文件在 /usr/include/gtk2.0 下,和 gtk 的头文件在同一目录,这样才能让 gtk 找到他们。同样 .so 文件也一样。
cd $QTDIR/src/gui
make & make install
这样就没有问题了。
总结:
1 如果系统已经安装好了 gtk ,安装 Qt4.5 的时候还是会比较顺利的。
2 如果需要其他库,到他的目录下 make & make install 就可以了。