PC所用 Linux系统版本:Ubuntu8.10
Qt/Embedded版本:qt- embedded-linux-opensource-src-4.4.3
Qt/X11版本:qt-x11-opensource-src-4.4.3
(这两个版本时目前最新的,且在官网 上都有下载)
整个安装过程,其实也就时几个指令的问题:
------>解压缩Qt/Embedded, 指令tar zxvf qt- embedded-linux-opensource-src-4.4.3.tar.gz
------>为以后方便观看,可将解压缩后的文件夹重命名为qte:mv qt- embedded-linux-opensource-src-4.4.3 qte
------>进入qte文件夹,进行配置,我的指令是:./comfigure -prefix /opt/qte -qt-mouse-linuxup -qvfb
(其中-qvfb是必须的,否则你编译完后发现自己的Qt/E连qvfb调试器都不支持,白忙活一场,
-prefix /opt/qte是指将最终编译得到的各种工具,如qvfb,qmke,designer等以及库都安装在指定路径/opt/qte,当然这个选项你也可以不写,如果你不写的话系统编译后会自动帮你创建一个/usr/local/trolltech/qt...目录,上面所说的文件就都安装在这个目录下了;但是如果你要安装在 指定目录下的话,必须要先手动创建这么一个目录,如我这个就必须先在执行./configure命令之前先创建/opt/qte目录,否则会出错,又白忙活了。
如果你还要用到数据库mysql等其他一些内容的时候,一定要看 ./configure --help帮助文档,必要时可以先测试一下这个选项,如果只有一个选项 的话,configure是很快的,特别是有错误发生的时候)
整个安装过程大概就只有./congigure是又技术含量的,其他的就没什么好操作的了,接着的步骤:
--------->make(相当漫长的过程)
---------->make install(很多网上的帖子都没这一步,如上面所说,这一步就是将编译后的各种工具、库等安装 到你先前指定的目录)
---------->设定环境变量(这是新手很头疼的问题,其实弄清楚后也挺简单的,就是给你的指令指定 一个可执行的路径,具体实现为 :
在你的用户目录下【若为管理员账户,则为/root,若为普通用户,则在/home/你的用户名】,修改 .bashrc文件。打开 .bashrc文件,在文件末尾添加这么几行
export QTDIR = /opt/qpe
export QTEDIR = $QTDIR
export PATH = /opt/qte/bin:$PATH
export LD_LIBRARY_PATH = opt/qte/lib:$LD_LIBRARY_PATH
保存,搞定。这样,以后你只要 在终端输入qmake或make或designer 等指令就可以直接使用qmake等工具了,而不再需要进入到/opt/qte/bin里面来执行./qmake了 ,这就是环境变量的作用。)
Qt/Embedded的安装到此告一段落,接着轮到Qt/X11,这个就简单多了,因为它在./configure时没什么要求。
----------->解压缩,tar zxvf .....
----------->更改解压缩后的文件名为qt(仅仅是为了个人方便):mv .... qt
------------>进入qt文件夹,执行./configure -prefix /opt/qt (仅需一个选项)
------------->make(更加漫长的过程)
-----------make install
------------>进入到解压缩文件夹qt里的tool/qvfb目录,输入make
------------>将qt文件夹里的bin/qvfb复制到/opt/qte/bin目录 下
最后两个步骤是为了生成qvfb。用于调试程序,可进入到qte/demos/chip下,调试一个例程看看qvfb是否已经安装成功。
#qvfb &
# ./chip -qws
便会 看到 qvfb上显示有相关例程的图像了。
到此,安装过程全部结束,我算了下 ,总共要花7个多小时……累
如果在.配置指令/configure ……执行后,发生错误,可以进入到解压缩文件目录(如qt/,qte/),执行make configclean便可将前面所有的配置都清除掉。
在qt和qte make install 完后,可 执行 make clean将中间生成的许多.o文件清楚,这些临时文件要占很大一部分空间。
--------------------------------------------------------------------------------------------------------------------------------------------
出现的问题
编译结束后我尝试的步骤如下: (着急的直接看最后几行!!)
1.进入qvfb源码目录:
# cd /home/src/qt-x11-opensource-src-4.4.3/tools/qvfb
2.执行qmake生成pro工程:
# /home/src/qt-x11-opensource-src-4.4.3/bin/qmake -project
3.执行qmake生成Makefile
# /home/src/qt-x11-opensource-src-4.4.3/bin/qmake
4.编译make
# make
有错误:
g++ -c -pipe -g -O2 -Wall -W -D_REENTRANT -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I../../mkspecs/linux-g++ -I. -I../../include/QtCore -I../../include/QtCore -I../../include/QtGui -I../../include/QtGui -I../../include -I. -I.moc/release-shared -I.uic/release-shared -o .obj/release-shared/qvfb.o qvfb.cpp
qvfb.cpp:47:24: 错误:deviceskin.h:没有那个文件或目录
qvfb.cpp: In member function ‘void QVFb::init(int, int, int, int, int, const QString&)’:
qvfb.cpp:247: 警告:检测到调用 delete 运算符时可能出现的问题:
qvfb.cpp:247: 警告:invalid use of undefined type ‘struct DeviceSkin’
qvfb.h:53: 警告:forward declaration of ‘struct DeviceSkin’
qvfb.cpp:247: 附注:析构函数和类特定的 delete 运算符均不会被调用,即使它们在类定义时已经声明。
qvfb.cpp:257: 错误:‘DeviceSkinParameters’ 在此作用域中尚未声明
qvfb.cpp:257: 错误:expected `;'' before ‘parameters’
qvfb.cpp:259: 错误:‘parameters’ 在此作用域中尚未声明
qvfb.cpp:259: 错误:‘DeviceSkinParameters’ is not a class or namespace
qvfb.cpp:260: 错误:invalid use of undefined type ‘struct DeviceSkin’
qvfb.h:53: 错误:forward declaration of ‘struct DeviceSkin’
qvfb.cpp:261: 错误:对 ‘QVFb::connect(DeviceSkin*&, const char [13], QVFb* const, const char [13])’ 的调用没有匹配的函数
../../include/QtCore/../../src/corelib/kernel/qobject.h:197: 附注:备选为: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
../../include/QtCore/../../src/corelib/kernel/qobject.h:302: 附注: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
qvfb.cpp:277: 错误:对 ‘QVFbX11View::QVFbX11View(int&, int&, int&, int&, QVFbAbstractView::Rotation&, DeviceSkin*&)’ 的调用没有匹配的函数
qvfbx11view.h:52: 附注:备选为: QVFbX11View::QVFbX11View(int, int, int, int, QVFbAbstractView::Rotation, QWidget*)
qvfbx11view.h:49: 附注: QVFbX11View::QVFbX11View(const QVFbX11View&)
qvfb.cpp:280: 错误:对 ‘QVFbView::QVFbView(int&, int&, int&, int&, QVFbAbstractView::Rotation&, DeviceSkin*&)’ 的调用没有匹配的函数
qvfbview.h:109: 附注:备选为: QVFbView::QVFbView(int, int, int, int, QVFbAbstractView::Rotation, QWidget*)
qvfbview.h:106: 附注: QVFbView::QVFbView(const QVFbView&)
qvfb.cpp:281: 错误:invalid use of undefined type ‘struct DeviceSkin’
qvfb.h:53: 错误:forward declaration of ‘struct DeviceSkin’
qvfb.cpp:284: 错误:对 ‘QVFb::connect(DeviceSkin*&, const char [37], QVFbAbstractView*&, const char [37])’ 的调用没有匹配的函数
../../include/QtCore/../../src/corelib/kernel/qobject.h:197: 附注:备选为: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
../../include/QtCore/../../src/corelib/kernel/qobject.h:302: 附注: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
qvfb.cpp:285: 错误:对 ‘QVFb::connect(DeviceSkin*&, const char [39], QVFbAbstractView*&, const char [39])’ 的调用没有匹配的函数
../../include/QtCore/../../src/corelib/kernel/qobject.h:197: 附注:备选为: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
../../include/QtCore/../../src/corelib/kernel/qobject.h:302: 附注: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
qvfb.cpp:287: 错误:invalid use of undefined type ‘struct DeviceSkin’
qvfb.h:53: 错误:forward declaration of ‘struct DeviceSkin’
qvfb.cpp:289: 错误:对 ‘QVFb::setCentralWidget(DeviceSkin*&)’ 的调用没有匹配的函数
../../include/QtGui/../../src/gui/widgets/qmainwindow.h:116: 附注:备选为: void QMainWindow::setCentralWidget(QWidget*)
qvfb.cpp:302: 错误:对 ‘QVFbX11View::QVFbX11View(int, int, int, int&, QVFbAbstractView::Rotation&, DeviceSkin*&)’ 的调用没有匹配的函数
qvfbx11view.h:52: 附注:备选为: QVFbX11View::QVFbX11View(int, int, int, int, QVFbAbstractView::Rotation, QWidget*)
qvfbx11view.h:49: 附注: QVFbX11View::QVFbX11View(const QVFbX11View&)
qvfb.cpp:305: 错误:对 ‘QVFbView::QVFbView(int, int, int, int&, QVFbAbstractView::Rotation&, DeviceSkin*&)’ 的调用没有匹配的函数
qvfbview.h:109: 附注:备选为: QVFbView::QVFbView(int, int, int, int, QVFbAbstractView::Rotation, QWidget*)
qvfbview.h:106: 附注: QVFbView::QVFbView(const QVFbView&)
qvfb.cpp:306: 错误:invalid use of undefined type ‘struct DeviceSkin’
qvfb.h:53: 错误:forward declaration of ‘struct DeviceSkin’
qvfb.cpp: In member function ‘void QVFb::enableCursor(bool)’:
qvfb.cpp:379: 错误:invalid use of undefined type ‘struct DeviceSkin’
qvfb.h:53: 错误:forward declaration of ‘struct DeviceSkin’
qvfb.cpp: In member function ‘void QVFb::setZoom(double)’:
qvfb.cpp:453: 错误:invalid use of undefined type ‘struct DeviceSkin’
qvfb.h:53: 错误:forward declaration of ‘struct DeviceSkin’
qvfb.cpp: In member function ‘void QVFb::skinConfigChosen(int)’:
qvfb.cpp:771: 错误:‘DeviceSkinParameters’ 在此作用域中尚未声明
qvfb.cpp:771: 错误:expected `;'' before ‘parameters’
qvfb.cpp:773: 错误:‘parameters’ 在此作用域中尚未声明
qvfb.cpp:773: 错误:‘DeviceSkinParameters’ is not a class or namespace
make: *** [.obj/release-shared/qvfb.o] 错误 1
差点就放弃了。后来仔细看了一下编译错误。估计主要是差个头文件:
qvfb.cpp:47:24: 错误:deviceskin.h:没有那个文件或目录
一般差头文件会导致cpp文件中很多数据结构和常量没有定义。找到头文件deviceskin.h在qt-x11-opensource-src-4.4.3/tools/shared/deviceskin/下面。拷贝到qvfb文件夹下。再编译:
编译没有问题,连接出错:
.obj/release-shared/qvfb.o: In function `QVFb::setZoom(double)'':
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/qvfb.cpp:453: undefined reference to `DeviceSkin::setTransform(QMatrix const&)''
.obj/release-shared/qvfb.o: In function `QVFb::enableCursor(bool)'':
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/qvfb.cpp:379: undefined reference to `DeviceSkin::hasCursor() const''
.obj/release-shared/qvfb.o: In function `QVFb::skinConfigChosen(int)'':
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/qvfb.cpp:773: undefined reference to `DeviceSkinParameters::read(QString const&, DeviceSkinParameters::ReadMode, QString*)''
.obj/release-shared/qvfb.o: In function `QVFb::init(int, int, int, int, int, QString const&)'':
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/qvfb.cpp:259: undefined reference to `DeviceSkinParameters::read(QString const&, DeviceSkinParameters::ReadMode, QString*)''
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/qvfb.cpp:260: undefined reference to `DeviceSkin::DeviceSkin(DeviceSkinParameters const&, QWidget*)''
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/qvfb.cpp:281: undefined reference to `DeviceSkin::setView(QWidget*)''
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/qvfb.cpp:297: undefined reference to `DeviceSkinParameters::hasSecondaryScreen() const''
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/qvfb.cpp:298: undefined reference to `DeviceSkinParameters::secondaryScreenSize() const''
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/qvfb.cpp:306: undefined reference to `DeviceSkin::setSecondaryView(QWidget*)''
.obj/release-shared/x11keyfaker.o: In function `X11KeyFaker::sendKeyEvent(int, bool)'':
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/x11keyfaker.cpp:475: undefined reference to `XTestFakeKeyEvent''
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/x11keyfaker.cpp:459: undefined reference to `XTestFakeKeyEvent''
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/x11keyfaker.cpp:468: undefined reference to `XTestFakeKeyEvent''
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/x11keyfaker.cpp:454: undefined reference to `XTestFakeKeyEvent''
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/x11keyfaker.cpp:447: undefined reference to `XTestFakeKeyEvent''
.obj/release-shared/x11keyfaker.o:/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/x11keyfaker.cpp:459: more undefined references to `XTestFakeKeyEvent'' follow
.obj/release-shared/x11keyfaker.o: In function `X11KeyFaker::connect()'':
/home/src/qt-x11-opensource-src-4.4.3/tools/qvfb/x11keyfaker.cpp:544: undefined reference to `XTestQueryExtension''
collect2: ld 返回 1
make: *** [qvfb] 错误 1
能看出来有两个方面的错误,一个是DeviceSkinParameters类的函数连接,另一个XTestFakeKeyEvent函数的问题。
我尝试的解决办法:
将qt-x11-opensource-src-4.4.3/tools/shared/deviceskin/下deviceskin.h,deviceskin.cpp都拷到qvfb文件夹下面,重新生成pro工程、Makefile文件,再执行make.
在Makefile文件中LIBS里面添加-lXtst选项。。 再次make。 OK!!
生成的qvfb正确运行。。
总结起来解决办法是:
1。复制deviceskin.h,deviceskin.cpp到qvfb文件下。
2。在qvfb文件夹下手动生成qvfb工程。
3。修改Makefile 中 LIBS 选项: 添加 -lXtst选项,ubuntu默认没有安装libxtst,需要自己手动安装,sudo apt-get install libxtst-dev。
编译。。。