您的位置:首页 > 运维架构 > Linux

Linux系统下安装QT及Qt远程调试

2016-11-23 14:11 946 查看
QT安装教程及QT程序在线调试

1.offline安装桌面版QT(这个可以不安装)

修改qt-opensource-linux-x86-5.5.1.run属性,双击安装



默认情况下系统是没有g++编译环境的。需要手动安装。执行sudo apt-get install build-essential。

安装完成以后,你可以启动QtCreator应用程序,编写一个测试程序,但是你也可能会遇到类似如下的错误提示:

/usr/bin/ld: cannot find -IGL

其含义是缺少OpenGL库支持,因此需要安装相关的OpenGL包,执行下面的命令即可:

$: sudo apt-get installmesa-common-dev libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev

安装完成后就可以正确编译测试程序了。

 

2. 安装arm-linux-gcc交叉编译器

解压文件tar zxvfarm-linux-gcc4.4.3.tar.gz

Sudo password root设置密码,sudo nautilus 即可进入root文件夹。修改/etc/bash.bashrc文件(此文件只对当前用户适用)

       $sudo gedit /etc/bash.bashrc

在最后加上export PATH=$PATH:/home/zaihuan/arm-linux-gcc/bin,立即使新的环境变量生效,不用重启电脑:

       方法一:$ source /root/.bashrc

       方法二:$ source /etc/profile

       方法三:注销系统(若上面不成功建议注销系统一下)

检查是否将路径加入到PATH:

   $ echo $PATH

       显示内容/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4. 4.3/bin 
说明已经将交叉编译器的路径加入PATH。至此,交叉编译环境安装完成

 

安装兼容库,在终端输入:sudoapt-get install g++-multilib,测试是否安装成功,输入arm- 按两下tab

 $ arm-linux-gcc-4.4.3–v

 

3.Linux下安装QT(桌面版)

解压文件qt-everywhere-opensource-src-4.8.3.tar.gz,进入解压目录,执行 ./configure  -embeddedx86    -qt-gfx-qvfb    -qt-kbd-qvfb  -qt-mouse-qvfb

./configure –prefix /opt/qt-4.8.3-arm 可以修改安装路径

Make

Make install

运行/usr/local/Trolltech/Qt/bin/designer,看见 qt 启动,也就是说 qt 安装好了。

设置环境变量

In order to use Qt forEmbedded Linux, the PATH variable must be extended to locate qmake, moc andother Qt
forEmbedded Linux tools, and the LD_LIBRARY_PATH must beextended for compilers that do not support rpath.

To setthe PATH variable, add the following lines toyour .profile file if your shell is bash, ksh, zsh or sh:

 1)先修改用户环境变量

vi /etc/.bashrc

在其最后添加以下信息

exportQTDIR=/usr/local/Trolltech/Qt-4.8.3

        export PATH=$QTDIR/bin:$PATH

        export MANPATH=$QTDIR/man:$MANPATH

        export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

  2)再修改所有用户环境变量

       vi /etc/profile

        在其最后添加以下信息

        exportQTDIR=/usr/local/Trolltech/Qt-4.8.6

        export PATH=$QTDIR/bin:$PATH

        export MANPATH=$QTDIR/man:$MANPATH

        export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

测试一下,重新开一个终端,输入命令:

       qmake -v

       输出结果:

       QMake version 2.01a

              Using Qt version 4.8.3 in/usr/local/Trolltech/Qt-4.8.6/lib

        输入命令:

       which qmake

       输出结果:

       /usr/local/Trolltech/Qt-4.8.3/bin/qmake

        证明 Qt 环境变量已经被配置成功。

 

4.安装安装ARM版本的QT、qtcreator以及QT的配置

安装ti-sdk-am335x-evm-06.00.00.00-Linux-x86-Install.bin
切换到qtcreator所在目录下,直接运qt-creator-linux-x86-opensource-2.7.1.bin,点下一步即可
启动QT程序,点击选项选择build-run, QT配置如下,











 

5. 用GDB Server进行远程调试

某些时候由于模拟环境的限制,调试必须要在目标板上进行。由于嵌入式系统资源比较有限,一般不能在目标板上直接构建GDB的调试环境,这时我们通常采用gdb+gdbserver的远程调试方法:gdbserver在目标板中运行,而gdb则在主机上运行。

构建gdb+gdbserver调试环境的在于,要将gdb和gdbserver都编译成适用于目标板的版本。比如我们用x86的主机和ARM目标板,平时在主机上直接调试的时候都使用用于x86调试的gdb,但这个gdb不能用于远程调试中,需要针对ARM平台进行配置之后重新编译才行;而gdbserver要运行在目标板上,则需要用arm-linux-gcc编译才行。

一、先安装所需要的环境

sudo apt-get install texinfo

sudo apt-get installlibncurses5-dev

sudo apt-get install m4

sudo apt-get install flex

sudo apt-get install bison

我们可以从http://ftp.gnu.org/gnu/gdb/或其他站点下载GDB的源代码来进行编译。得到源代码包gdb-6.6.tar.gz(版本自己选择)之后,将target配置成arm-linux,然后进行编译:

$ tar xzvf gdb-6.6.tar.gz

$ cd gdb-6.6

$ ./configure--target=arm-linux(可以用prefix修改配置目录)

$ make

$ make install

--target指定了需要调试的目标机环境,一般设置为交叉编译器的前缀,比如--target=arm-linux, --target=mips-linux,--target=armv5-linux-uclibc, --target的缺省值为i386-linux, 也就是i386PC机

--host指定编译后的文件的运行环境,取值可以是i386-linux或者交叉编译器的前缀,缺省为i386-linux

       编译ARM用的GDB时出现error: no termcap library found错误的解决方法:

checking for library containing gethostbyname... none required

checkingfor library containing socketpair... none required

checking for library containing waddstr... no

checkingfor library containing dlgetmodinfo... no

checking for library containing tgetent... no

configure: error: no termcap library found

make[1]: *** [configure-gdb] 错误 1

        解决方法:sudo apt-get install libncurses5-dev

安装后,在/opt/crosstool/arm-gdb/bin可以看到arm-linux-gdb、arm-linux-gdbtui、arm-linux-run等

       二、配置环境变量

       。。。@ubuntu:~/downloads/gdb-6.5$ vi ~/.bashrc

在文件最后加上

       if [ -d /opt/crosstool/arm-gdb/bin]; then

       PATH=/opt/crosstool/arm-gdb/bin:$PATH

       fi

使刚配置的环境变量生效

。。。@ubuntu:~/。。。/gdb-6.5$ source ~/.bashrc

注意这时我们编译的是用于主机上的gdb程序,因此仍然用x86版本的gcc编译,而不是用arm-gcc。

而接下来我们要编译的gdbserver程序则是运行在目标板上的,需要用arm-gcc来编译了,用CC=<your_arm-linux-gcc_path>来指定arm-linux-gcc编译器:

$ cd gdb/gdbserver/

$ ./configure--target=arm-linux --host=arm-linux

$ make CC=/。。。arm-linux-gcc-4.4.3   //arm-linux-gcc的绝对路径

编译gdbserver时出现了linux-x86-low.c error: sys/reg.h: No such file or directory情况,解决方法如下:

1.找到config.h里的HAVE_SYS_REG_H这个宏定义,把它注释掉.

2. 在linux-x86-low.c的头文件#include<sys/reg.h>注释掉.

3.交叉编译器要指明具体路径

4.重新make之前先make clean一下.

。。。@ubuntu:~/。。。/gdb-6.5/gdb/gdbserver$ ls

可以看到刚刚生成的gdbserver,将其拷贝到nfs共享目录下,因为gdbserver最终是在目标机上运行。

附录:Ubuntu下如何安装NFS服务及其配置

安装Ubuntunfs

NFS(Network FileSystem,网络文件系统)是由SUN公司发展,并于1984年推出的技术,用于在不同机器,不同操作系统之间通过网络互相分享各自的文件。NFS设计之初就是为了在不同的系统间使用,所以它的通讯协议设计与主机及操作系统无关。

NFS分服务器和客户机,当使用远端文件时只要用mount命令就可把远端NFS服务器上的文件系统挂载在本地文件系统之下,操作远程文件与操作本地文件没有不同。NFS服务器所共享文件或目录记录在/etc/exports文件中。

嵌入式Linux开发中,会经常使用NFS,目标系统通常作为NFS客户机使用,Linux主机作为NFS服务器。在目标系统上通过NFS,将服务器的NFS共享目录挂载到本地,可以直接运行服务器上的文件。在调试系统驱动模块以及应用程序,NFS都是十分必要的,并且Linux还支持NFS根文件系统,能直接从远程NFS root启动系统,这对嵌入式Linux根文件系统裁剪和集成也是十分有必要的。

Ubuntu上默认是没有安装Ubuntu nfs服务器的,因此我们首先安装Ubuntu nfs服务器端:

      $sudoapt-get install nfs-kernel-server

执行命令:mkdir/home/zaihuan/nfs 建立一个nfs服务的专有的文件夹,这里路径依自己喜好而定!不过要记得这个路径

在终端中输入sudoapt-get install vim-gtk,安装vim命令

建立好文件夹后,接着执行命令:sudo vim/etc/exports 配置nfs

在文章的最后一行添加:
/home/zaihuan/nfs*(rw,sync,no_root_squash,no_subtree_check)
/home/song/nfs:与nfs服务客户端共享的目录,这个路径必须和你前面设置的文件的路径一致!

*:允许所有的网段访问,也可以使用具体的IP

rw:挂接此目录的客户端对该共享目录具有读写权限

sync:资料同步写入内存和硬盘

no_root_squash:root用户具有对根目录的完全管理访问权限。

no_subtree_check:不检查父目录的权限。更多的参数说明我在文章下面贴出来了!

5、修改完上述配置文件保存退出。

执行命令:sudo/etc/init.d/portmap restart 重启portmap服务。nfs是一个RPC程序,使用它前,需要映射好端口,通过portmap设定。

执行命令:sudo/etc/init.d/nfs-kernel-server restart 重启nfs服务。

NFS挂载时出现"access denied by server whilemounting"的解决方法,在这里我就总结一下出现此错误的几种原因: 

       1)使用了非法端口,也就是使用了大于1024的端口。这个错误,可以通过查看日志确认:

[root@local~ /]# cat /var/log/messages | grep mount

Jan 2 12:49:04 localhost mountd[1644]: refused mount request from 192.168.0.100for /home/nfsshare/ (/home/nfsshare): illegal port 1689

       解决办法:

       修改配置文件/etc/exports,加入insecure 选项,重启nfs服务,再尝试挂载。

/home/nfsshare/  *(insecure,rw,async,no_root_squash)

       2)NFS版本问题

编辑/etc/sysconfig/nfs文件,找到下面:

#Turn off v2 and v3 protocolsupport

#RPCNFSDARGS="-N 2 -N3"

#Turn off v4 protocol support

#RPCNFSDARGS="-N 4"  /*把这句前面的#号去掉*/

最后保存,重启nfs服务,再尝试挂载;如果挂载不上,可尝试在后面加-o nolock参数。

       3)查看客户端挂载的目录是否具备读写权限,添加相应权限即可。

       4)nfs服务器上的/etc/hosts中设置了客户端机器IP对应域名,去掉即可。

通过以上这几种方法,access denied by server while mounting这个错误应该可以得到解决了。

通过查看网络端口状态可以判断服务器是否成功开启:

  $:sudonetstat -tlunp

       若发现有针对111端口及2049端口的监听,则说明服务器开启成功了。

三、配置/etc/exports

       Ubuntu nfs允许挂载的目录及权限在文件/etc/exports中进行了定义。例如,sudo gedit /etc/exports  我们要将根目录下的

/opt/FriendlyARM/mini2440/rootfs_qtopia_qt4

目录共享出来,那么我们需要在/etc/exports文件末尾添加如下一行:/opt/FriendlyARM/mini2440/rootfs_qtopia_qt4 *(rw,sync,no_root_squash)

其中:/opt/FriendlyARM/mini2440/rootfs_qtopia_qt4   是要共享的目录,*代表允许所有的网络段访问,

 rw是可读写权限,

 ync是资料同步写入内存和硬盘,

 no_root_squash是Ubuntu nfs客户端分享目录使用者的权限,如果客户端使用的是root用户,那么对于该共享目录而言,该客户端就具有root权限。

Ubuntu nfs重启服务

$sudo /etc/init.d/portmaprestart

$sudo/etc/init.d/nfs-kernel-server restart

四、测试Ubuntu nfs

此时可以运行以下命令来显示一下共享出来的目录:

  $showmount-e  

或者可以使用以下命令把它挂载在本地磁盘上。例如将opt/FriendlyARM/mini2440/rootfs_qtopia_qt4  挂载到/mnt下:$ sudo mount -t nfslocalhost:/opt/FriendlyARM/mini2440/rootfs_qtopia_qt4  /mnt,可以运行df命令查看是否挂载成功。(这样,在/mnt目录下创建目录,/opt/FriendlyARM/mini2440/rootfs_qtopia_qt4  下也会出现),查看后可以使用以下命令卸载:

$ sudo umount /mnt

在ARM开发板上  mount -t nfs192.168.0.5:/usr/local/mytest   /mnt  -o nolock

其中 192.168.0.5为主机ip地址  :/usr/local/mytest主机挂载目录

/mnt 开发板目录

同时还遇见这个问题mount:RPC:Unable to receive;errno=connection refused ,关闭主机防火墙和杀毒软件才可以

设置好之后使用板子ping主机可以ping通

但是发现使用使用虚拟机ping板子却不通,而在windows下使用cmd命令是可以ping通的,检查发现,虚拟机和主机的网络需要使用bridge模式,虚拟机的虚拟网卡需要是自动获取的

       在前面的设置,有时候也不是很好使,因此找了一种比较可靠的配置方式

1 设置桥接模式

 




2 设置虚拟机的IP地址



或者



 

3 关闭虚拟网卡


4设置主机的IP地址,注意主机,虚拟机还有开发板网址在同一个网段上,开发板上设置的0.232  虚拟机是0.100 主机是0.35



5 虚拟机ping开发板



6 开发板ping虚拟机 并挂载

 


可以看到文件夹下的数据了

 

 


 在调试的过程中发现问题

 nfs:server is notresponding,still trying

原因分析:NFS 的默认传输协议是 UDP,而PC机与嵌入式系统通过UPD交互时就会出现严重的网卡丢包现象。解决方法:在客户端改用TCP协议,使用下面的命令,

#mount -o tcp 192.168.0.100:/usr/myqt /mnt -o nolock

五、gdbserver调试

安装完gdbserver后,拷贝libthread库(这一步不做的话,运行gdbserver会出错!)

将libthread_db-1.0.so拷贝到nfs共享目录下,然后在你在开发板上运行gdbserver前,先设置一下库文件搜索路径LD_LIBRARAY_PATH,若根文件系统非只读文件系统,那你大可以直接将libthread_db-1.0.so拷贝到开发板的/lib或/usr/lib,然后建立相应的符合链接

得到gdb和gdbserver之后,将gdbserver下载到目标板上就可以进行远程调试了。我们还是以前面用过的overflow程序为例来说明,注意overflow程序也需要重新用arm-linux-gcc编译得到ARM版本的overflow程序,并下载到目标板上。

完成这些之后可以用file命令来检查所准备gdb和gdbserver及overflow程序的格式是否正确:

$ file arm-linux-gdb

arm-linux-gdb: ELF 32-bit LSBexecutable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.4.17, dynamicallylinked (uses shared libs), not stripped

$ file overflow

overflow: ELF 32-bit LSBexecutable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked(uses shared libs), not stripped

$ file gdbserver

gdbserver: ELF 32-bit LSBexecutable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked(uses shared libs), not stripped

注意确保在目标板上运行的gdbserver及overflow程序被编译成ARM ELF格式,而gdb由于是运行在主机上,还是x86格式的。

gdb和gdbserver之间可以通过TCP(格式为host:port)、UDP(格式为udp: host:port)或者串口(比如/dev/ttyb)来通信,我们以TCP方式为例来说明。

1.TCP调试

假设目标板的IP为192.168.2.1,主机为192.168.2.100,使用端口5678来调试,首先在目标板上运行gdbserver:

# gdbserver 192.168.16.1:5678./overflow

Process ./overflow created;pid = 618

Listening on port 5678

然后在主机上运行gdb,并运行gdb命令“target remote 192.168.2.1:5678”:

$ arm-linux-gdb ./overflow

GNU gdb 6.6

Copyright (C) 2006 FreeSoftware Foundation, Inc.

GDB is free software, coveredby the GNU General Public License, and you are

welcome to change it and/ordistribute copies of it under certain conditions.

Type "show copying"to see the conditions.

There is absolutely nowarranty for GDB. Type "show warranty" for details.

This GDB was configured as"--host=i686-pc-linux-gnu --target=arm-linux"...

(gdb) target remote192.168.2.1:5678

Remote debugging using192.168.2.1:5678

0x28556080 in ??()

(gdb)

接下来你就可以象前面所介绍的那样使用gdb命令了,比如设置断点及查看变量单步执行等。

2.如何利用串口调试

       如果你用串口1调试hello的话,你就要现在板子上运行命令: gdbserver hello /dev/ttyS0 (详情可以参考gdbserver目录下的readme文件),这时gdbserver就在等待gdb的应答信号了。然后在pc机上运行命令:xxx-linux-gdb hello 

       在xxx-linux-gdb里敲入如下命令:setremotedevice /dev/ttyS0(这里设置串口1) 

set remote baud 9600 (这里设置串口波特率) 

set debug remote 1(可选) 

target remote /dev/ttyS0 

操作到这儿,gdb就应该和gdbserver联系上了。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux qt 远程调试