Chinaunix首页 | 论坛 | 博客
  • 博客访问: 563837
  • 博文数量: 252
  • 博客积分: 1068
  • 博客等级: 少尉
  • 技术积分: 1775
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-05 21:33
文章分类

全部博文(252)

文章存档

2013年(21)

2012年(231)

分类:

2012-07-14 09:50:43

原文地址:Linux下QT环境的建立 作者:zhangyanwei37

在根新建目录wu2410,然后把所需的安装包下载到目录下,在终端进入目录下
4.1 tmake 安装
tar xfvz tmake-1.11.tar.gz
mv tmake-1.11 tmake
export TMAKEDIR=$PWD/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-generic-g++
4.2 QT编译
tar xfvz qt-x11-2.3.2.tar.gz
mv qt-2.3.2 qt-x11
cd qt-x11
export QTDIR=$PWD
echo yes | ./configure -static -no-xft -no-opengl -no-sm
make -C src/moc
cp src/moc/moc bin
make -C src
make -C tools/designer
make -C tools/qvfb
cp tools/qvfb/qvfb bin
strip bin/uic bin/moc bin/designer bin/qvfb
4.3 QTE编译
tar xfvz qt-embedded-2.3.7.tar.gz
mv qt-2.3.7/ qt
cp qt-x11/bin/?* qt/bin
export QTDIR=$PWD/qt
export QPEDIR=$PWD/qtopia
export TMAKEDIR=$PWD/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-generic-g++
export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH
cd qt
make clean
cp ../qtopia/src/qt/qconfig-qpe.h src/tools/
(echo yes; echo yes ) |./configure -platform linux-generic-g++  -qconfig qpe -depths 16,24,32
make -C src
4.5 QPE编译
tar xfvz qtopia-free-1.7.0.tar.gz
mv qtopia-free-1.7.0 qtopia
#tar xfvz e2fsprogs-1.35.tar.gz
#cd e2fsprogs-1.35
export LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATH
#./configure
#make
#make install lib/uuid/
将e2fsprogs-1.35/lib/目录下uuid的文件夹复制到qtopia/include下
将e2fsprogs-1.35/lib/中的libuuid.a复制到/qtopia/lib下

cd qtopia/src
./configure  -platform linux-generic-g++
make
当在PC上模拟Qtopia的运行时,需要用到对应Qt版本的库文件,因此需要修改/etc/ld.so.conf 文件以适应刚刚安装的Qt(Redhat安装时带有Qt库,但不适合我们最新安装的版本),修改后的ld.so.conf文件内容如下:
/wu2410/qt/lib
/wu2410/qtopia/lib
/usr/kerberos/lib
/usr/X11R6/lib
/usr/lib/sane
修改完此文档后,为了让刚刚安装的库生效,必须运行ldconfig。 至此Qt的开发缓建已经建立
(1)设置环境变量
export QTDIR=$PWD/qt
export QPEDIR=$PWD/qtopia
export TMAKEDIR=$PWD/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-generic-g++
export PATH=$QTDIR/bin:$QPEDIR/bin:$TMAKEDIR/bin:$PATH
(2)启动虚拟帧缓存
 qvfb &
 或qvfb -width 640 –height 480 &
(3)运行qtopia
 qpe &

=====================================================================

1.   Prepare software and cross-compile toolchain
xscalev1.tar.gz          arm交叉编译工具链
e2fsprogs-1.35.tar.gz     用于编译生成libuuid库
tmake-1.11.tar.gz         生成makefile
qt-embedded-2.3.7.tar.gz    Qt/Embedded
qt-x11-2.3.2.tar.gz           Qt/X11
qtopia-free-1.7.0.tar.gz       Qtopia

Suppose that we save these software to /root/qt-arm
2.   Install toolchain这里使用的是xscale板子提供的交叉编译工具链
cd /root/qt-arm
tar zxvf xscalev1.tar.gz
mv xscalev1 /opt/
vi ~/.bash_profile                               添加到PATH路径
  PATH=/opt/xscalev1/bin:$PATH        add    
source ~/.bash_profile

3.   Install tmaketmake用于交叉编译生成qt应用程序的makefile, 也可用于生成qt的本地makefile,区别在于设置TMAKEPATH路径的不同,一个用于arm,一个用于x86。
注意:tmake 机子上本来就有的,但我们要使用11以上的版本,如果是11以上的版本可以不用安装。tmake –v 查看一下它的版本,有些版本比较老,建议换掉,同时把以前的tmake可执行文件删掉
tmake使用:在某个qt工程文件夹内
       qmake –project                           生成工程文件 假定工程文件夹名hello
       tmake hello.pro –o Makefile   生成makefile
       make                                                 编译连接成可执行文件
 
cd /root/qt-arm
tar zxvf tmake-1.11.tar.gz
vi tmake-1.11/lib/qws/linux-arm-g++/tmake.conf
       TMAKE_LINK=arm-linux-g++      //将原来的arm-linux-gcc 改成 arm-linux-g++
       TMAKE_LINK_SHLIBS=arm-linux-g++
mv tmake-1.11       /usr/local/
vi ~/.bash_profile                                             添加以下一些信息
PATH=/usr/local/tmake-1.11/bin:$PATH ßadd
TMAKEPATH=/usr/local/tmake-1.11/lib/qws/linux-arm-g++      
export PATH
export TMAKEPATH    
source ~/.bash_profile
假如不用这种方法,可以直接用:
export PATH=$PWD/tmake-1.11/bin:$PATH
export TMAKEPATH=$PWD/tmake-1.11/lib/qws/linux-arm-g++
4.   Install e2fsprogs为arm编译libuuid库
cd /root/qt-arm
tar zxvf e2fsprogs.tar.gz
cd e2fsprogs
mkdir build
cd build
../configure --enable-elf-shlibs --build=i386-linux --host=arm-linux --with-cc=/opt/xscalev1/bin/arm-linux-gcc --with-linker=/opt/xscalev1/bin/arm-linux-ld
make
其中lib/libuuid.so.1.2    libuuid.so.1     libuuid.so      即是我们需要编译的库
 
5.   Unpack Qtopiacd /root/qt-arm
tar zxvf qtopia-free-1.7.0.tar.gz
cd qtopia-free-1.7.0
export QPEDIR=$PWD                                    QPEDIR环境变量下面要用到
 
6.   Install Qt/Embeddedcd /root/qt-arm
tar zxvf qt-embedded-2.3.7.tar.gz
cd qt-2.3.7
export QTDIR=$PWD
export QTEDIR=$PWD
export PATH=$PWD/bin:$PATH
export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
vi src/kernel/qwsmouse_qws.cpp               修改触摸屏驱动,详见附件
cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/
./configure -shared -xplatform –thread –no-xft linux-arm-g++  -qconfig qpe -depths 4,8,16,32
依次输入yes,no
vi src/Makefile
add "-DQWS_CUSTOMTOUCHPANEL" into "QT_CXXFLAGS_OPT"
make sub-src
其中lib目录下的libqte.so.2.3.7即是我们需要的qte库,还有一些支持多线程的库
 
7.   Install Qt/X11编译qt-x11-2.3.2并非是用来开发,而是Virtual为了产生编译qtopia必须的库以及用于在图形环境下进行调试的qvfb(Qt Virtual Frame Buffer)。
这里安装qtopia时之要编译qt-2.3.2,是为了使用qt-2.3.2生成的uic,所以要用gcc/g++编译,不要用arm-linux-gcc/g++编译。注意不能直接用/usr/bin/uic,读者自己比较。
cd /root/qt-arm
tar zxvf qt-x11-2.3.2.tar.gz
cd qt-2.3.2/
vi configs/linux-g++-shared  修改语句
SYSCONF_CXXFLAGS_X11= -I/usr/include/freetype2  斜体为我们要修改的语句
export QTDIR=$PWD
export PATH=$PWD/bin:$PATH
export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
./configure –no-xft                     
make
make -C tools/qvfb/
cp tools/qvfb/qvfb bin/
./bin/qvfb &                  x11-FrameBuffer就运行起来了
cp bin/uic $QPEDIR/bin/
cp bin/uic $QTEDIR/bin/
 
8.   Build Qtopiacd /root/qt-arm/qtopia-free-1.7.0
cp /root/qt-arm/e2fsprogs/build/lib/libuuid.so*  /opt/xscalev1/lib/
cp /root/qt-arm/e2fsprogs/build/lib/libuuid.so*  /opt/xscalev1/arm-linux/lib/
cp -a /usr/include/uuid  include/
export QTDIR=$QTEDIR
export PATH=$PWD/bin:$PATH
export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
cd src/
./configure -xplatform linux-arm-g++                 需要交叉编译
make
9.   Running application运行程序有两种方式,一种是把相应的库和应用程序下载到板子上,另一种是通过nfs方式。
 
9.1  running application in board
将qt-2.3.7/lib 目录下载到板子上/usr/local/qt-embedded/目录下
将qtopia-free-1.7.0目录下的文件(要做一些裁减工作,把不必要的文件删除)下载到/usr/local/qtopia目录下
Minicom 登陆到开发板上
下载步骤略
export LD_LIBRARY_PATH=/usr/local/qt-embedded/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/qtopia/lib:$LD_LIBRARY_PATH
cd /usr/local/qtopia/bin
./qpe –qws &                                                         运行qpe程序,移植成功
 
9.2 running application through nfs
首先我们的pc机要开启nfs服务,详见开发板网络配置文档
Pc机:
vi /etc/exports
       /     *(rw, no_root_squalsh)
/etc/rc.d/init.d/nfs start                                     开启nfs服务
netstat –au                                                       查看是否开启nfs服务,如果没有查看防火墙
 
开发板:
Minicom登陆到班子上
mount –t nfs –o tcp 192.168.1.22:/root/qt-arm  /mnt/qt-arm
cd /mnt/qt-arm
cd qt-2.3.7
export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
cd ../qtopia-free-1.7.0
export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
cd bin
./qpe –qws                      运行qpe程序,移植成功
附件1:触摸屏修改程序
class QCustomTPanelHandlerPrivate : public QWSMouseHandler {
Q_OBJECT
public:
    QCustomTPanelHandlerPrivate(MouseProtocol, QString dev);
    ~QCustomTPanelHandlerPrivate();
private:
    int mouseFD;
    unsigned char prevstate;
private slots:
    void readMouseData();
};
QCustomTPanelHandlerPrivate::QCustomTPanelHandlerPrivate( MouseProtocol, QString ){
#ifdef QWS_CUSTOMTOUCHPANEL
    if ((mouseFD = open( "/dev/ts", O_RDONLY)) < 0) {
        qWarning( "Cannot open /dev/ts (%s)", strerror(errno));
              return;    
    } else {
        sleep(1);
    }
    QSocketNotifier *mouseNotifier;
    mouseNotifier = new QSocketNotifier( mouseFD, QSocketNotifier::Read, this );
    connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData()));
#endif
}
QCustomTPanelHandlerPrivate::~QCustomTPanelHandlerPrivate(){
    if (mouseFD >= 0)
       close(mouseFD);
}
struct CustomTPdata {
  unsigned char status;
  unsigned short xpos;
  unsigned short ypos;
};
void QCustomTPanelHandlerPrivate::readMouseData()
{
    if(!qt_screen)
        return;
    CustomTPdata data;
                                                                                                                           
     short  data2[4]={0};                                                                                                                           
    int ret;                                                                                            
    ret=read(mouseFD,data2,sizeof(data2));
    if(ret) {
        data.status=data2[0];
        data.xpos=data2[1];
        data.ypos=data2[2];
        QPoint q;
        q.setX(data.xpos);
        q.setY(data.ypos);
        mousePos=q;
        if(data.status && !prevstate) {
              emit mouseChanged(mousePos,Qt::LeftButton);
        } else if(!data.status&&prevstate){
              emit mouseChanged(mousePos,0);
        }
              prevstate=data.status;
    }
    if(ret<0) {
        qDebug("Error %s",strerror(errno));
    }

}

========================================================================================

准备以下源码包和文件(可以从网上下载)
tmake-1.11.tar.gz
qt-embedded-2.3.7.tar.gz
qt-x11-2.3.2.tar.gz
qconfig-local.h
假设源码包放在/home/build_qte/目录下
cd /home/build_qte/

1 tmake 配置
  tar zxvf tmake-1.11.tar.gz   ; 解压tmake源码包
  cd tmake-1.11            ; 进入解压目录
  vi env.sh                ; 建立shell文件,在文件中添加如下内容
  export TMAKEDIR=$PWD
  export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
  export PATH=$TMAKEDIR/bin:$PATH
  保存退出.
  source env.sh             ; 添加环境变量
  cd ..                    ; 退出tmake-1.11目录

2 配置编译qt-embedded源码包
  tar zxvf qt-embedded-2.3.7.tar.gz
  mv qt-2.3.7 qt-2.3.7-x86
  cd qt-2.3.7-x86
  cp /home/build_qte/qconfig-local.h src/tools/   ; qconfig-local.h文件在开发板提供的光碟上可以找到
  vi env.sh  ;添加如下内容
  export QTDIR=$PWD
  export QTEDIR=$QTDIR
  export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
  export PATH=$QTDIR/bin:$PATH
  ;保存退出.
  source env.sh             ; 添加环境变量
  ./configure -qconfig local -gif -thread -qvfb -depths 4,8,16,32   ;配置源码包
  make sub-src   ;编译
  cd ..

3 配置编译qt-x11源码包
  tar zxvf qt-x11-2.3.2.tar.gz
  cd qt-2.3.2
  export QTDIR=$PWD
  export PATH=$QTDIR/bin:$PATH
  export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
  ./configure -no-xft -no-opengl
  make
  make -C tools/qvfb
  cp tools/qvfb/qvfb $QTEDIR/bin/
  cp bin/uic $QTEDIR/bin
  cd ..

  ; 退出终端!

4 实例
  ; 建立qte开发的工作目录
  mkdir /home/qte
  cd /home/qte

  ; 建立shell文件,设置环境变量
  vi set-qte-x86.sh
  ; 在文件中添加如下
   #!/bin/bash
   export QTDIR=/home/build_qte/qt-2.3.7-x86                    ;编译qt-2.3.7的目录
   export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
   export TMAKEDIR=/home/build_qte/tmake-1.11              ;tmake-1.11的目录
   export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++
   export PATH=$QTDIR/bin:$TMAKEDIR/bin:$PATH
   echo $PATH
  ; 保存退出
  ; 先不要执行source set-qte-x86.sh (不要设置环境变量)

  ; 建立工程目录
  mkdir hello
  cd hello
  ; 用designer生成工程文件(hello.pro), 窗体文件(hello.ui), 和main.cpp文件.

progen -n hello -o hello.pro

  cd ..
  source set-qte-x86.sh ;设置环境变量
  cd hello
 
  ; 生成源文件 
  uic hello.ui -o hello.h
  uic hello.ui -i hello.h -o hello.cpp
  删除hello.pro, hello.ui文件, 省下hello.h, hello.cpp, main.cpp三个文件

  progen -o hello.pro  ; 生成工程文件

  tmake hello.pro -o Makefile  ; 生成Makefile文件

  make  ;开始编译

  ; 在PC机的模拟执行
  qvfb &
  ; 新建终端, 在新建的终端中执行如下
  cd /home/qte
  source set-qte-x86.sh
  cd hello
  ./hello -qws ; 执行刚才编译的hello.

阅读(836) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~