前言:
花了3天的时间将qte的开发环境以及arm版本移植好,花费的时间多主要是一些软件的依赖关系以及环境变量的配置,还有软件本身编译的时间很长,最后终于克服重重困难,把qte移植到了开发板上。其实不难,主要是要有耐心,会分析错误及上网查资料。下面说说我的移植过程:
编译了两个版本,一个是用于PC机调试的x86版本,还有一个arm版本。开发时可以先通过x86版本以及qvfb来调试,调试通过再编译成arm版本下发到开发板上即可。
-
二、安装qte的pc机的x86版本
-
1.下载源程序
-
ftp://ftp.qt.nokia.com/qt/source/qt-embedded-linux-opensource-src-4.5.3.tar.gz
-
-
2.解压
-
在/tmp目录下新建两个文件夹qte-x86和qte-arm,将qt-embedded-linux-opensource-src-4.5.3解压之后,把里面的文件分别全部复制到qte-x86和qte-arm中。须要说明的是:在qte-x86目录下编译x86架构的编译工具链,用于PC机上的仿真调试。在qte-arm目录下编译arm架构的编译工具链,用于交叉编译在arm开发板上运行的程序。
-
tar -zxvf qt-embedded-linux-opensource-src-4.5.3
-
-
3.进入/tmp/qte-x86/qt-embedded-linux-opensource-src-4.5.3,运行configure生成makefile
-
./configure -prefix /usr/local/qte-x86 -no-qt3support -system-zlib -system-libtiff -system-libpng -qt-libmng -system-libjpeg -make libs -make examples -make demos -no-nis -no-cups -no-iconv -xplatform qws/linux-x86-g++ -embedded x86 -depths 16,24,32 -qt-gfx-qvfb -no-gfx-linuxfb -no-gfx-transformed -no-gfx-vnc -no-gfx-multiscreen -qt-kbd-usb -qt-kbd-tty -qt-kbd-qvfb -qt-mouse-pc -no-glib -qt-mouse-qvfb
-
-
3.1 出现如下错误:
-
The target system byte order could not be
-
Turn on verbose messaging (-v) to see the final report.
-
You can use the -little-endian or -big-endian switch to
-
./configure to continue.
-
解决方法:发现QMAKESPEC路径不对,设置export QMAKESPEC= /tmp/qte-x86/qt-embedded-linux-opensource-src-4.5.3/mkspecs/qws/linux-x86-g++
-
再./configure之后就成功。
-
-
4.编译 make
-
-
4.1出现如下错误:
-
image/qpnghandler.cpp:53:17: error: png.h:没有发现此文件
-
修改方法:找到该qpnghandler.cpp文件,打开后将原来的
-
#include <png.h>
-
#include <pngconf.h>
-
改为:直接到头文件目录下边,
-
#include "/tmp/qt-embedded-linux-opensource-src-4.5.3/src/3rdparty/libpng/png.h"
-
#include "/tmp/qt-embedded-linux-opensource-src-4.5.3/src/3rdparty/libpng/pngconf.h"
-
再make编译就能通过。
-
-
4.2出现如下错误:
-
/usr/bin/ld: cannot find –lpng
-
解决方法:sudo apt-get install libpng12-0 libpng12-dev
-
/usr/bin/ld:cannot find -lxxx
-
意思是编译过程找不到对应库文件。其中-lxxx表示链接库文件libxxx.so。
-
-
一般出现这种错误有以下几种原因:
-
1.系统缺乏对应的库文件
-
2.库文件版本不对应
-
3.库文件链接错误
-
4.库文件路径设置不正确
-
-
对于前2种情况,可以通过下载安装lib来解决:
-
sudo apt-get install libxxx-dev(上面编译Qt的情况大多是这样)
-
-
而对于第3种情况,通过find或者locate命令定位到链接文件,查看链接文件是否正确的指向了lib文件。如果不是,用 ln -sf */libxxx.so.x */libxxx.so 命令修改。
-
-
对于最后一种情况,可以到/etc/ld.so.conf.d目录下,修改其中任意一份conf文件(也可自建conf),将lib所在的目录写进去,然后在终端输入ldconfig更新缓存。
-
-
4.3又出现找不到头文件错误
-
#include <jpeglib.h>
-
改为:
-
#include "/tmp/qt-embedded-linux-opensource-src-4.5.3/src/3rdparty/libjpeg/jpeglib.h"
-
-
4.4之后又出现错误:
-
/usr/bin/ld: cannot find –ljpeg
-
解决方法:sudo apt-get install libjpeg62-dev
-
-
4.5又出现找不到头文件错误
-
#include "tiffio.h"改为
-
#include "/tmp/qt-embedded-linux-opensource-src-4.5.3/src/3rdparty//libtiff/libtiff/tiffio.h"
-
-
4.6然后出现错误
-
/usr/bin/ld: cannot find -ltiff
-
sudo apt-get install libtiff4 libtiff4-dev libtiffxx0c2
-
-
编译通过
-
-
5.make install (安装到了/usr/local/qte-x86,最好事先建立该该文件夹)
-
-
-
三、安装qte的arm版本
-
1.下载源程序及解压,同上步骤
-
2.确认tslib已经安装好(参见tslib的安装)
-
3.修改交叉环境变量
-
在/usr/local/qt-4.7.3-linux-arm/mkspecs/qws/linux-arm-g++/qmake.conf文件中修改如下:
-
-
QMAKE_CC = /root/tools/arm-2009q1/bin/arm-none-linux-gnueabi-gcc
-
QMAKE_CXX = /root/tools/arm-2009q1/bin/arm-none-linux-gnueabi-g++
-
QMAKE_LINK = /root/tools/arm-2009q1/bin/arm-none-linux-gnueabi-g++
-
QMAKE_LINK_SHLIB = /root/tools/arm-2009q1/bin/arm-none-linux-gnueabi-g++
-
QMAKE_AR = /root/tools/arm-2009q1/bin/arm-none-linux-gnueabi-ar cqs
-
QMAKE_OBJCOPY = /root/tools/arm-2009q1/bin/arm-none-linux-gnueabi-objcopy
-
QMAKE_STRIP = /root/tools/arm-2009q1/bin/arm-none-linux-gnueabi-strip
-
QMAKE_INCDIR = /usr/local/tslib/include/
-
QMAKE_LIBDIR = /usr/local/tslib/lib/
-
-
4.修改系统环境变量
-
export QMAKESPEC=/tmp/qt-embedded-linux-opensource-src-4.5.3/mkspecs/qws/linux-arm-g++
-
这里还要注意PATH环境变量:(PATH环境变量错误也会导致下边configure时发生众多错误,很难改,我是重启了系统之后重新设置,之后才弄好)
-
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/qt/bin:/root/tools/arm-2009q1/bin:/root/tools
-
-
5.configure
-
./configure -prefix /usr/local/qte-arm -no-qt3support -qt-zlib -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -make libs -nomake demos -nomake docs -no-nis -no-cups -no-iconv -xplatform qws/linux-arm-g++ -embedded arm -little-endian -qt-freetype -depths 8,16,24,32 -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-qvfb -no-gfx-vnc -no-gfx-multiscreen -qt-kbd-usb -qt-kbd-tty -qt-mouse-pc -no-glib -qt-mouse-tslib -verbose -I/usr/local/tslib/include -L/usr/local/tslib/lib
-
-
6. make
-
-
7.make install
-
-
8.为了方便使用qte-x86和qte-arm工具链来编译程序,必要的环境变量还是得设置一下的。其实,在编译Qt程序时,我们一般只是使用到了qmake工具,所以只要在~/.bashrc中添加几个alias就可以了。
-
gedit ~/.bashrc
-
在该文件最后加上:
-
alias qte-x86-make='/usr/local/qte-x86/bin/qmake'
-
alias qte-arm-make='/usr/local/qte-arm/bin/qmake'
-
到这里,交叉编译环境以及要移植的环境都搭建好了。
-
-
四,制作配置文件系统
-
-
1.在根文件系统的根目录下创建qte-arm,tslib目录。即/qte-arm和/tslib.我们把/usr/local/qte-arm目录下的lib目录和include目录复制到开发板文件系统的qte-arm文件夹。然后将/usr/local/tslib/下面的所有文件都复制到开发板文件系统的tslib目录包括lib,bin等。
-
-
2.进入开发板的/tslib/etc文件夹,修改触屏配置
-
gedit /tslib/etc/ts.conf
-
修改如下:
-
module_raw input #就是在把这个之前的#号去掉,其他不变
-
module pthres pmin=1
-
module variance delta=30
-
module dejitter delta=100
-
module linear
-
-
3.最后,就是设置开发板的环境变量了,在你制作的文件系统中,进入/etc修改profile文本添加以下信息
-
export QTDIR=/qte-arm
-
//添加路径
-
export PATH=$QTDIR/bin:$PATH
-
//指定tslib主目录位置
-
export TSLIB_ROOT=/tslib
-
//指定触摸屏设备
-
export TSLIB_TSDEVICE=/dev/input/touchscreen0
-
//指定触摸屏校准文件pointercal存放位置
-
export TSLIB_CALIBFILE=/etc/pointercal
-
//指定TSLIB配置文件的位置
-
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
-
//指定触摸屏插件所在路径
-
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
-
//指定帧缓冲设备
-
export TSLIB_FBDEVICE=/dev/fb0
-
//设定控制台设备为none否则默认为/dev/tty,这样会出现”open consol device:No such file or directory KD…..”的错误
-
export TSLIB_CONSOLEDEVICE=none
-
//指定TSLIB的库文件路径
-
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:TSLIB_ROOT/lib
-
//指定触摸屏设备
-
export QWS_MOUSE_PROTO=tslib:/dev/input/touchscreen0
-
-
五,测试
-
在/opt/code编写三个文件如下:这些代码是在网上摘录的
-
//finddialog.cpp
-
#include <QtGui>
-
#include "finddialog.h"
-
FindDialog::FindDialog(QWidget *parent)
-
:QDialog(parent)
-
{
-
label=new QLabel(tr("Find &what:"));
-
lineEdit=new QLineEdit;
-
label->setBuddy(lineEdit);
-
caseCheckBox=new QCheckBox(tr("Match &case"));
-
backwardCheckBox=new QCheckBox(tr("Search &backward"));
-
findButton=new QPushButton(tr("&Find"));
-
findButton->setDefault(true);
-
findButton->setEnabled(false);
-
closeButton=new QPushButton(tr("Close"));
-
connect(lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(enableFindButton(const QString &)));
-
connect(findButton,SIGNAL(clicked()),this,SLOT(findClicked()));
-
connect(closeButton,SIGNAL(clicked()),this,SLOT(close()));
-
QHBoxLayout *topLeftLayout =new QHBoxLayout;
-
topLeftLayout->addWidget(label);
-
topLeftLayout->addWidget(lineEdit);
-
QVBoxLayout *leftLayout=new QVBoxLayout;
-
leftLayout->addLayout(topLeftLayout);
-
leftLayout->addWidget(caseCheckBox);
-
leftLayout->addWidget(backwardCheckBox);
-
QVBoxLayout *rightLayout=new QVBoxLayout;
-
rightLayout->addWidget(findButton);
-
rightLayout->addWidget(closeButton);
-
rightLayout->addStretch();
-
QVBoxLayout *mainLayout=new QVBoxLayout;
-
mainLayout->addLayout(leftLayout);
-
mainLayout->addLayout(rightLayout);
-
setLayout(mainLayout);
-
setWindowTitle(tr("Find"));
-
setFixedHeight(sizeHint().height());
-
-
}
-
void FindDialog::findClicked()
-
{
-
QString text =lineEdit->text();
-
Qt::CaseSensitivity cs=caseCheckBox->isChecked() ? Qt::CaseSensitive :Qt::CaseInsensitive;
-
if(backwardCheckBox->isChecked())
-
{
-
emit findPrevious(text,cs);
-
}
-
else
-
{
-
emit findNext(text,cs);
-
}
-
}
-
-
void FindDialog::enableFindButton(const QString &text)
-
{
-
findButton->setEnabled(!text.isEmpty());
-
}
-
-
//finddialog.h
-
#ifndef FINDDIALOG_H
-
#define FINDDIALOG_H
-
-
#include <QDialog>
-
-
class QCheckBox;
-
class QLabel;
-
class QLineEdit;
-
class QPushButton;
-
-
class FindDialog : public QDialog
-
{
-
Q_OBJECT
-
public:
-
FindDialog(QWidget *parent=0);
-
signals:
-
void findNext(const QString &str,Qt::CaseSensitivity cs);
-
void findPrevious(const QString &str,Qt::CaseSensitivity cs);
-
private slots:
-
void findClicked();
-
void enableFindButton(const QString &text);
-
private:
-
QLabel *label;
-
QLineEdit *lineEdit;
-
QCheckBox *caseCheckBox;
-
QCheckBox *backwardCheckBox;
-
QPushButton *findButton;
-
QPushButton *closeButton;
-
-
};
-
#endif
-
-
//main.cpp
-
#include <QtGui/QApplication>
-
#include "finddialog.h"
-
-
int main(int argc, char *argv[])
-
{
-
QApplication a(argc, argv);
-
FindDialog *dialog=new FindDialog;
-
dialog->show();
-
return a.exec();
-
}
-
-
在编写一个hello.pro文件,代码如下:
-
HEADERS = finddialog.h
-
SOURCES = finddialog.cpp main.cpp
-
CONFIG+=qt warn_off release
-
在当前目录执行:
-
-
1.qte-x86-make hello.pro
-
-
用qte-x86-make hello.pro编译时
-
qmake后出现错误 qt_config.prf:10: include(file) requires one argument.
-
解决方法:
-
环境变量设置的问题,将环境变量QMAKESPEC修改指向当前编译平台的路径:
-
export QMAKESPEC=/usr/local/qt/mkspecs/linux-g++
-
编译通过
-
-
2.make
-
会生成一个可执行的hello。我们继续执行qvfb &,打开qvfb。然后执行./hello -qws,会出现如下图面。本机交叉编译测试成功。
-
-
3.接着我们执行make clean。主要是消除上面qte-x86-make产生的文件,不然我们在下面使用qte-arm-make的时候会报错。继续执行:
-
qte-arm-make hello.pro
-
-
当用交叉编译工具时,环境变量QMAKESPEC修改指向当前编译平台的路径
-
export QMAKESPEC=/usr/local/qte-arm/mkspecs/qws/linux-arm-g++
-
-
4.make
-
将生成的hello可执行文件放到开发板文件系统的根目录,执行./hello -qws,就可出现画面。
阅读(693) | 评论(0) | 转发(0) |