前言:本文记录了自己从一个完全不懂Linux的人如何一步步学会Linux程序开发的过程。当然也希望本文能够达到它的目的,让那些和我一样没有任何基础的人也能快速入门Linux程序开发。
一、Arm-Linux程序开发平台简要介绍
Arm-Linux程序的开发并不像我们以前接触的Windows程序开发那样,关于平台的搭建就繁琐很多,所以在正式进入程序开发之前先对这种开发模式进行简要介绍,让一个即使没有任何Linux开发经验的程序员也能够看懂后面的内容。
1.1程序开发所需系统及开发语言
开发arm-linux程序至少需要三种系统:
Windows系统。
主要用来文件传送和一些简单的文本文件编辑。这个系统其实并非必需,只是因为目前PC机上最流行的系统仍然是Windows系统,我们的很多关于PC的文件和数据的操作习惯都是在Windows系统上养成的,已经对其形成了严重的依赖,所以Windows系统扮演着的“辅助开发系统”的角色。
PC-Linux系统。
在此系统上安装arm-Linux交叉编译器后,就可以对代码文本文件进行编译,生成可在arm-Linux系统中运行可执行程序。此系统被称为“Linux宿主机”,我们对Linux程序的开发工作(包括代码编写、调试和编译生成可执行文件)基本上就是在此系统上进行的。
Arm-Linux系统。
Arm-Linux程序运行的平台。此系统的硬件载体是一块小型的嵌入式arm板,我们在Linux宿主机上开发好程序并编译生成arm-linux可执行程序后,将可执行程序文件传送到嵌入式arm板中,然后就可以在arm板上直接运行此程序了。
三种系统的职能和联系如下图:
关于每个系统的职能及操作还有文件如何传送交流都在后面详细介绍。
关于开发语言,因为目前购买的Arm-Linux嵌入式板提供的编译库都是C/C++的,所以一般选择C/C++进行程序设计。
1.2系统平台搭建方式
关于“三系统”的搭建方式,有两种方法:三台分立的单系统机器组合或者一台双系统PC机和一台单系统Arm板机器。但是不管采用哪种组合方式,各种系统的职能都是一样的,而且都是通过FTP、Telnet或者SSH等网络协议进行文件传输交流。
“三机器”组合模式。将三个系统分别安装在三台机器上并将三台机器组建局域网。
“两机器”组合模式。在PC机上利用虚拟工作站可以同时运行两个系统,虚拟机上的Linux系统基本可以完成所有的实体PC-Linux机器的所有任务,当然也能够组建局域网。
“三机器”组合模式图
“两机器”组合模式图
如果开发人员对机器性能要求比较高,那么建议采用“三机器”组合模式。因为“两机器”组合模式要求一台机器运行双系统,每个系统都需要分配一定的硬件资源,可能会对每个系统运行的流畅程序都造成影响。
如果开发人员只进行一些简单的程序开发,则建议采用“两机器”组合模式。这样可以节省硬件设备的投资,而且开发环境的搭建、开发的流程等等都会简单一些。而且下面的内容都是基于这种“两机器”组合的开发模式。
二、Linux开发平台搭建
2.1安装虚拟工作站
目前比较流行的虚拟工作站比较多,推荐使用VM-ware WorkStation。建立虚拟工作站的目的就是为了使一台机器同时运行多个不同类型的系统,方便开发人员进行跨平台开发应用程序。
(关于VMware,可以到网上搜索到详细介绍和使用方法,在此不再赘述)
2.2安装Linux虚拟机
安装虚拟机的过程和安装实体机一样,唯一的区别是,虚拟机安装是从VMware中打开并安装的。先准备Linux安装文件,一般可以到网上下载到Linux的iso安装文件,然后从VMware中安装此系统。
(关于虚拟机安装,在网上可以搜索到详细的步骤,在此不再赘述)
几点建议:
1.安装Fedora-10并选择完全安装,即把所以的包和选项都勾上。这样在安装完毕后,系统就自带了很多开发工具和相关的库,避免自己去重新进行烦琐的基本开发平台搭建。
2.在VMware中为虚拟系统配置硬件资源。建议分配硬盘空间16G,内存1G以上。因为今后主要的Linux程序开发工作是在虚拟机上进行了,所以为了保证虚拟机流畅运行,需要分配比较丰富的硬件资源。
在第一次从ISO文件中安装完毕虚拟机后,在安装目录下面会生成一系列的文件,将这些文件进行备份后,在其它机器上安装虚拟机的时候就花几个小时去从ISO中安装了,将这个目录下的文件复制到相应的目录下面(在第一次从ISO中安装的时候设定的目录相同),然后只需要从VMware中打开此目录下的文件就行了。
执行VMware Workstation中的【View】--【Home】,调出Home视图,然后打开虚拟工作站系统文件。
打开后,就可以看到一个虚拟机的硬件资源配置了。这些参数有一部分是在只能在初次使用iso安装的时候配置的,比如硬盘大小。另外一些参数比如内存大小、共享目录等等可以在后期随时人工更改的。
(详细设置内容,到网上可以找到很多相关内容,在此不再赘述)
两种方法的区别就是WinXp的安装盘和Ghost盘的区别吧。
安装完毕Fedora后,就可以从虚拟工作站中启动Fedora Linux系统了。系统桌面如下:
2.3虚拟机的一些基本配置
在第一次安装完毕虚拟机后开启虚拟机,默认的分辨率是800*600,同时没有全能共享目录。为了获得比较好的操作界面,同时方便文件共享和转移,需要进行一些基本的配置。
2.3.1建立共享目录
在同一个硬件PC机上运行的两个系统。Windows实体系统用来做一般的用途,比如联网,处理文档等等;Fedora Linux虚拟系统则用来开发Linux程序并进行编译生成可执行文件。
先需要安装vmware tools
在VMware上面,选择菜单【VM】--【Install VM tools】,然后在Linux虚拟机上会生成目录/media,同时里面产生一个rpm文件。
然后打开控制终端并su登录超级用户:
cd /media
rpm �Civh VMwareTools-7.8.5-156735.i386.rpm
cd /usr/bin
然后在/usr/bin下面看到wmware-config-tools.pl
再在Teminal中输入wmware-config-tools.pl
然后一路回车下去。然后今后就可以建立共享目录。
(详细过程也可以在网上搜索相关内容)
共享目录的好处是可以将这些文件在Windows系统中提取出来,然后可以通过我们熟悉的windows系统进行网络传输和一些其它命令操作。这个设置在后面程序开发的时候会提到其使用方法。
在VMware中建立共享目录,执行菜单命令【VM】--【Settings…】
然后在Linux虚拟机文件系统中可以找到对应的共享目录:/mnt/hgfs/xplinux
建立共享目录可以方便虚拟机和实体机进行文件交流。例如,我们可以将在Linux机器上编译生成好执行文件放置到共享目录中,然后可以通过Windows机器提取出来并通过网络传送到arm-linux嵌入式板上。
2.3.2调整桌面分辨率
在VMware工作站中调整虚拟机桌面分辨率。一般默认是800*600,而且现在的显示器,一般是1024*768甚至更高,以我目前使用的电脑显示器为例,分辨率是1440*900。需要将虚拟机桌面分辨率进行适当调整,然后全屏,那么就可以获得比较友好的操作界面。
在VMware中启动虚拟机,虚拟机启动后的登录界面如下:
然后登录系统,设置分辨率,系统菜单:
【System】--【Preferences】--【Hardware】--【Screen Resolution】
设置好分辨率后,就可以在获得全屏状态的Linux操作界面了。
2.3.2其它设置
比如设置桌面背景,系统字体,还有资源管理器的模式等等,这些可以自己去实地操作并进行熟悉。
2.4安装软件
虽然Fedora已经自带了一些必要的软件,如Open Office办公软件,gedit记事本软件,Firefox网页浏览器等等。但是既然是操作系统,我们也可以安装一些我们需要的软件。比如中文输入法(如:小企鹅输入法),聊天工具(如QQ)等等。
注意:在Terminal终端中安装程序的时候需要启用su超级用户权限。
三、Fedora-linux系统
Fedora-linux虚拟机安装完毕并进行基本设置后,就可以开始了程序开发环节了。在正式开始程序开发时,还需要对Linux的一些基本编程工具进行简要介绍,当然如果已经有此基础的,可以直接略过这一章。
3.1控制终端的基本操作命令
执行系统菜单命令【Applications】--【System Tools】--【Terminal】,打开Terminal终端:
熟悉Windows系统的DOS操作界面的人肯定也会对此操作终端也不会陌生。通过在Terminal中输入命令,用户可以很方便地完成Linux下的一系列操作,在正式进入自主程序设计之前,用户有必要对下面一些最基本命令进行熟悉(其它的命令在项目需要的时候再到网上查找相关资料)。
文件操作命令 |
文件/文件夹的创建、修改、复制、删除、移动等等。(如rm/mv/vi/cat等等) |
网络设置命令 |
个性IP、开启FTP、开启Telnet、开启SSH等等。(如ifconfig/telnetd等等) |
用户管理命令 |
系统用户的添加、删除、密码修改等等。(如,addusr/passwd等等) |
文件编译命令 |
这个涉及到编译环境的建立,将在后面正式进入到自主程序设计时进行详细介绍。 |
这个涉及到编译环境的建立,将在后面正式进入到自主程序设计时进行详细介绍。
虽然目前Fedora为用户提供了比较良好的操作界面,但是Linux最初是从命令行的操作系统发展起来的,很多强大的功能都是需要依靠Terminal控制终端来实现的,所以作为开发人员有必要先对这些基本命令进行熟悉并熟练操作。
3.2编程工具简介
如果在安装Fedora的时候,选择的是完全安装,系统会自带很多开发工具。其中Fedora -Eclipse CDT和Qt库及相关设计器Qt Designer是我们今后开发的主要工具。
当然,如果用户没有选择安全安装,则可以到网上下载到各类开发工具的安装文件,并自己进行安装。
3.2.1 Fedora-Eclipse CDT
在Fedora中执行系统菜单【Application】--【Programming】--【Eclipse】
然后就可以看到Fedora Eclipse的启动画面
然后就是下面就是Eclispe的IDE环境了,有过Windows下的Java编程经验的人来说,这个界面是再熟悉不过了,完全可以直接过渡到Linux下的C/C++程序开发上来,这样就极大地减少了程序员的学习周期。
Eclipse的好处,第一就是开源,第二就是免费,第三就跨平台。
因为开源,所以可扩展性很强,Eclipse实际上就是一个万能的程序开发环境,只需要在设置中对相关语言的库进行引用并连接相应的编译器,就可以对基于任何语言的程序进行开发;因为免费,所以省去了注册软件等等琐事。因为跨平台,所以当用户进行跨平台程序设计的时候,可以极大减少学习周期。
Eclispe在Windows平台下一般都是作为Java的开发环境,用来开发Java桌面应用程序和Jsp网页应用程序甚至目前比较流行的Android手机终端软件。在Linux下面对C/C++的库编译器进行了连接后,则成为Linux下的C/C++开发环境,在Linux下安装JDK后则可以进行Linux下的Java程序设计,如果给Linux系统安装tomcat网页服务器,则可以进行Linux下的网页应用程序开发,如果给Linux安装mysql数据库服务,则可以进行数据库连接操作等等(因为目前我们的目标主要是arm-linux窗口程序开发,所以主要对C/C++进行研究)。
3.2.2 Qt库及Qt界面设计软件
如果只是编写C/C++控制台软件,则只需要Eclipse CDT就完全可以解决。但是如果要进行窗体化编程,就需要引用一些开源的界面库。例如目前比较流行的Qt库。
Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但Qt具有优良的跨平台特性、面向对象 、丰富的API、大量的开发文档等优点。
在Eclipse中对项目Build选项进行设置,对Qt库进行连接,然后就可以进行Linux下的Qt程序进行开发了。
因为Eclipse没有提供可视化的窗体程序设计器,所以需要借助第三方工具,QtDesigner可以很好的解决Qt的UI设计问题并编译生成对应的*.h和*.cpp文件(具体的操作步骤将在下面的内容中详细介绍)。
所谓“工欲善其事,必先利其器”,前面花了大量篇幅来介绍,都是为了“磨刀”,现在开始进入“砍柴”环节。下面将以Eclipse CDT作为开发环境来介绍Linux和arm-linux程序开发的一般方法。
四、使用Eclipse CDT开发Linux程序
4.1建立控制台程序
用Eclipse CDT建立基于C++的“Hello World”控制台程序。
打开Eclipse开发环境。执行【File】--【New】--【C++ Project】
然后进入到C++ Project向导,有C++的Hello World模板
点击Finish,然后Eclispe就会建立一个基于C++的HelloWorld项目,运行程序后,能够在控制台中输出“Hello World”:
说明:如果是开发控制台程序,则不需要进行任何其它设计,只需要直接编写C++代码即可,不用对编译库和编译器进行设置,Eclipse已经为我们自动完成了这些内容。
4.2建立Linux窗口程序
就像在Window环境下,如果要用C++开发窗口程序,我们一般需要使用Windows API或者MFC。同样,在Linux环境下,我们可能在C++项目中引用Qt库来进行Linux下的窗口程序开发。
在完整版的Fedora中,自带了Qt的库,在目录/usr/lib下面:
系统默认自带有两个版本的Qt库qt-3.3和qt4,一般我们用qt-3.3。
编写窗口程序,我们只需要在建立了C++ Project的情况下,对C/C++ Build路径进行设置,指向qt-3.3的库即可。主要开发流程如下:
第一步:使用Eclipse CDT建立C++ Project。
第二步:设置Build路径指向Qt。在项目管理器中右击项目文件设置项目属性,在C/C++ Build的Settings的Tool Settings中进行设置。
【GCC C++ Compiler】--【Directories】添加包含的文件路径:/usr/lib/qt-3.3/include。这个是C++的编译器包含的头文件路径,因为是建立的C++ Project,所以一定要设置。
【GCC C Compiler】--【Directories】添加包含的文件路径:/usr/lib/qt-3.3/include。这个是设置C语言编译器包含的头文件路径,因为有时候C++中会考虑到兼容一些C语言的语法和关键字,所以最好也进行相关设置。
【GCC C++ Linker】--【Libraries】添加编译时引用的库路径:/usr/lib/qt-3.3/lib(注意:不要写成include了)。并设置库搜索命令参数:qt-mt。
第三步:编写引用了Qt库的C++程序。
第四步:运行程序。
程序运行效果如下图:
总结:通过上面对Linux下面的控制台程序及窗口程序的介绍,我们已经对Linux系统下的简单程序开发流程有了简单了解。下面开始介绍arm-Linux程序的开发。
五、使用Eclipse开发Arm-linux程序
5.1 Arm-linux硬件平台
Arm-Linux机器采用的是飞凌嵌入式技术公司的FL2440开发板。在飞凌公司购买开发板的时候,会随开发板一起赠送的相关入门教程《飞凌开发板配套教程》并附有一张光盘,里面有各种写FL2440相关的开发资源。
在正式进入程序开发之前,先对FL2440开发板及arm-linux系统进行熟悉。
Fl2440开发板:熟悉Bootloader的使用方法、学会烧写内核、烧写文件系统等等。
Arm-linux系统:熟悉利用一些文件系统和网络设置相关的命令。如果你对Linux命令已经有了一定了解,那么arm-linux上的命令也基本一样。
(详细操作过程请参考《飞凌开发板配套教程》一书)
5.2开发控制台程序
主要开发流程图如下:
在早期的开发环境方式中,是先用文本编辑器编写c或者cpp文件,然后再直接在Linux机器上通过交叉编译命令,编译代码文本文件并生成可执行程序,然后将可执行程序传送到arm-linux板上,然后就可以在arm-linux机器上运行程序了。
现在的开发模式和早期的开发模式一样,只是在编写代码的工具上进行了改进。早期编写代码的工具只要是能编辑文本的软件就可以,甚至在Linux中通过终端的vi命令就可以搞定,Linux机器的职能仅仅是编写代码和编译代码。现在则使用Eclipse CDT,可以在Linux机器上编写C/C++代码并进行调试,Linux机器基本上可以模拟arm-linux系统上除了一些硬件相关度高的应用程序(如驱动程序)之外的绝大部分其它程序的运行环境。
5.2.1使用Eclipse CDT编写代码
其实和用Eclipse CDT编写Linux环境下的控制台程序是完全一样。除了在一些特别的场合,比如编写驱动程序,需要注意差别外,其余的功能的实现方法基本上一样。
这方面属于程序设计的基本功,需要长期学习和积累,所以在此不再多述。
5.2.2建立交叉编译环境
虽然生成程序的源码是一样的,但是在Linux机器上编译生成的可执行文件是不能在arm-linux系统上运行的,需要用arm-linux专用的编译器进行编译后,才能生成可在arm-linux系统上运行的可执行文件,当然此时应用程序又显然不能在Linux系统上运行了。
将交叉编译工具cross-2.95.3.tar.bz2(可以到网上下载,也可以到开发板附带的光盘资源中找到)通过共享目录传送到Linux系统中,然后在Linux系统终端中先进入其文件目录,然后执行解压命令:
tar xjvf cross-2.95.3.tar.bz2
然后在/usr/local/arm文件目录下可以看到解压后的2.95.3的库了,或者如果你解压的是cross-3.4.1.tar.bz2的版本,那么将会在对应目录下生成3.4.1的目录。
然后设置环境变量。因为Linux机器上存在不止一种编译器,为了避免环境变量冲突,最好新建一个账号,比如新建账号arm-linux-gcc,然后在对应的账号目录中找到.bash_profile文件,设置环境变量,编辑.bash_profile,在最后一行增加路径(vi打开文本文件,按i表示insert修改文本文件,然后Esc退出insert模式,再shift zz表示保存退出文件,详细的命令介绍可以到网上查阅相关资料):
export PATH=/usr/local/arm/2.95.3/bin:$PATH
可以通过echo $PATH来查看环境变量是否设置成功:
5.2.3编译并运行程序
在编辑好了代码文件并建立好了交叉编译环境后,就开始编译代码生成可执行程序,并移植到arm板上运行程序。
在Linux系统的终端中通过输入arm-linux-gcc/arm-linux-g++来编译C/C++文件。例如,我们对前面编写的最简单的CppHelloWorld.cpp文件进行编译:
arm-linux-g++ CppHelloWorld.cpp �Co CppHello
然后在对应目录下会生成一个可在arm-linux系统上运行的应用程序CppHello。
然后通过SSH服务和FTP服务,将可执行文件从Linux文件系统网络传送到arm-linux文件系统(在此用到了两个小软件SSH Secure和LeapFTP,在后面再对软件的功能进行一下简要介绍)。
然后在Windows机器上远程登录arm-linux系统开发板,并控制程序运行
注意:需要先通过chmod +x CppHello来告诉系统此文件是可执行文件,然后再通过./CppHello来运行程序。
我们可以看到程序运行的结果:在屏幕上打印出一行字“Hello World”
5.3一些常用的软件介绍
在上面介绍的一些操作中,在进行文件传送的时候用到了一些软件,在此进行简要介绍。
LeapFtp
LeapFtp |
一个基于Ftp协议的文件互传软件。一般情况下,我们对arm-linux机器上开启Ftp服务,然后就可以实现Windows机器和arm-linux机器之间文件互传。 |
SSH Secure File Transfer Client |
一个基于SSH协议的文件互传软件,可以实现FTP的功能。虽然Linux机器和Windows机器之间可以通过共享目录进行文件交互,但是因为共享目录实际上相当于Linux机器的一个虚拟的外接设备,在每次编写代码保存后,系统都会重读一次,给操作上造成一点小麻烦,所以建议使用SSH进行文件传送。 |
SSH Secure Shell Client |
一个基于SSH的远程登录软件,可以实现telnet功能。因为Fedora默认关闭了telnet功能,而采用更安全的SSH协议来实现telnet的相关功能。 |
三系统之间的主要网络架构如下:
注意:
1.如果arm-linux系统的ftp和telnet连接不上,一般情况下是arm-linux默认没有开启相应的服务或者默认ip和windows机器不在同一网段。可以通过串口线将arm板连接到电脑上,然后打开超级终端,输入命令vsftpd&开启ftp服务,输入命令telnetd开启telnet服务,ifconfig eth0 192.168.1.16设置IP到同一网段。
2.如果Linux系统的SSH连接不上,则一般情况下是Linux系统开启了SSH的防火墙,则只需要在Linux系统中对防火墙进行相关设置,关闭针对SSH的防火墙。【System】--【Administration】--【Firewall】,然后勾选全能SSH。
还有一些其它软件,比如小组协作时候,需要使用SVN进行代码管理;还有远程桌面VNC Viewer,可以进行远程桌面控制(但是效果不太好,桌面显示的延时好像比较严重)等等。
5.4开发arm-linux窗口程序
5.4.1建立Qt交叉编译环境
在Linux系统中新建目录/root/yizhi,然后将已经编译好的arm-QT库复制到此目录下面。
然后将上面那六个tar.gz压缩文件解压到/root/yizhi目录。
在进行arm-linux下的Qt编译的时候,也涉及到环境变量设置问题,所以我们也最好再新建一个账户,专门用于编译arm-Qt程序。
例如,在Linux系统终端中添加用户zsm,然后进入到/home/zsm中,对.bash_profile进行修改,设置环境变量:
在命令终端中ls �Ca 显示隐藏的所有文件 找到.bash_profile,输入:
gedit .bash_profile &
用geidt打开此文件后,在最后面添加下面的环境变量设置:
export PATH=/root/yizhi/qtopia-free-2.2.0/qtopia/bin:/root/yizhi/qtopia-free-2.2.0/tmake/bin:/root/yizhi/qtopia-free-2.2.0/qt2/bin:/usr/local/arm/2.95.3/bin:$PATH
export QTDIR=/root/yizhi/qtopia-free-2.2.0/qt2
export QTEDIR=/root/yizhi/qtopia-free-2.2.0/qtopia/
export LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATH
export CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc
export TMAKEDIR=/root/yizhi/qtopia-free-2.2.0/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
设置好后最好重新登录此账号,然后在终端中输入echo $PATH来检验环境变量是否设置成功:
如果出现上面的输出,则表示arm-linux平台下的Qt交叉编译环境的环境变量已经设置成功。接下来就可以进行Qt程序开发了。
5.4.2编译生成可执行窗体程序
在3.2节中已经写好了一个单文件的项目QtHello,并在项目的src目录下生成了一个QtHello.cpp文件,然后我们要做的就是利用arm-linux下的Qt编译器对其进行编译。
编译Qt窗体项目比编译普通控制台项目要稍微麻烦一点,需要自己写makefile来建立编译规则,编译如上的QtHello.cpp的makefile有如下模板:
############################################################################# # Makefile for building hello # Generated by tmake at 20:58, 2011/04/14 # Project: hello # Template: app ############################################################################# ####### Compiler, tools and options CC = arm-linux-gcc CXX = arm-linux-g++ CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG CXXFLAGS= -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -DNO_DEBUG INCPATH = -I. -I$(QTDIR)/include LINK = arm-linux-gcc LFLAGS = LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lm -lqte MOC = $(QTDIR)/bin/moc UIC = $(QTDIR)/bin/uic TAR = tar -cf GZIP = gzip -9f ####### Files TARGET = QtHello HEADERS = $(TARGET).h SOURCES = $(TARGET).cpp OBJECTS = $(TARGET).o DIST = INTERFACE_DECL_PATH = . ####### Implicit rules .SUFFIXES: .cpp .cxx .cc .C .c .cpp.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .cxx.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .cc.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .C.o: $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< .c.o: $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< ####### Build rules all: $(TARGET) $(TARGET): $(OBJECTS) $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) dist: $(TAR) hello.tar hello.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST) $(GZIP) hello.tar clean: -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET) -rm -f *~ core ####### Sub-libraries ###### Combined headers ####### Compile $(TARGET).o: $(TARGET).cpp
用zsm账号登录(因为关于arm-Qt库的编译环境变量是在此账号中设置的),然后执行如下步骤:
1.将makefile模板文件放置到src目录下面
2.用eclipse或者其它文本编辑器,修改makefile里面的TARGET一项为当前项目名称
3.打开Teminal控制终端,进入到src目录,输入make
4.然后会在src目录下面生成一个指定名称相应的QtHello文件,这个就是arm目标板上的运行程序了。
5.将QtHello文件传送到arm板并运行程序(详细操作方法在4.2.3节中有介绍)。
在Windows机器上远程登录arm板,控制程序运行,然后可以看到arm板上运行的结果了。
六、高级Linux程序设计
前面所介绍的不管是控制台还是窗体程序,都属于单文件项目的范围。而当程序的功能比较复杂时,则往往需要很多模块和文件,这样在向arm-linux上移植程序时会更加繁琐一些,需要开发人员自己写makefile,建立多文件的编译规则。
因为我对此没有进入深入一点的研究,所以只能提供下大致思路和在开发程序时遇到的一些常见问题及解决方案。如果今后有机会有时间的话,则会对makefile进行深入一点的研究,最好是能以Eclipse自己生成的makefile模板为基础进行简单的修改,然后就可以编译生成arm板上的可执行程序。
6.1多文件控制台项目
多文件的控制台程序的makefile可能会容易一些,自己也没有研究过,以前在使用Magic C++编写C++控制台程序的时候,只需要对Magic C++生成的makefile模块中的编译器进行修改就可以轻松为多文件生成基于arm-linux平台上的控制台程序。
(关于如何对Eclipse的makefile模板进行修改,目前还没有研究过,今后有时间研究的话,再补充上吧。)
6.2多文件Qt项目
目前只对简单的多文件项目进行了尝试:一个main函数文件,一个窗体头文件,一个窗体实现文件。
6.2.1使用Qt Designer设置界面
在Linux系统中打开Qt Designer,然后进行可视化窗口设计。然后点击保存为mydialog.ui文件。
打开mydialog.ui文件,发现其实只是一个xml文件:
显然这个文件是不能直接被C++项目引用的,需要使用Qt Designer的编译器进行编译,生成和界面对应的h和cpp文件。
在Terminal终端里面运行以下命令:
uic xxx.ui -o xxx.h 生成.h文件
uic xxx.ui -i xxx.h -o xxx.cpp 生成.cpp文件
然后生成的mydialog.h和mydialog.cpp文件就是和mydialog.ui相对应的程序代码文件了。可以在Eclipse项目中直接对此文件进行引用,就可以显示对应的窗体了。
6.2.2多文件Qt开发时的一些经典错误
经典错误一:
“undefined reference to ……”
这是在引用Qt的库时,产生了某些歧义,需要进行一些预先处理,生成和界面文件相对应的moc文件,关于问题的详细介绍可以参考下面的帖子:
http://hi.baidu.com/asky007/blog/item/7aad95ccbee5ba1601e928d7.html
解决方案:
在Linux控制终端中进入到项目代码文件目录,执行
qmake �Cproject
qmake
make
然后此目录下会生成一系列的文件,如moc_xx.cpp,moc_xx.o,src,src_pro等等。然后再到Eclipse中编译此项目,则错误消失。
经典错误二:
在Linux机器上能运行的Qt窗口程序,在arm-linux下的Qt编译器下无法通过。
可能的问题是Qt库版本问题,或者是有些Qt运行环境在Linux机和arm-linux机上有所不同,这就需要重新寻找新的代替解决方案。正是因为这些很多不确定的因素,所以在进行arm-linux界面程序开发时,需要经常在编写一段新代码就要在arm板上进行测试,可以避免做太多无用功。
6.3关于makefile
关于多文件Qt项目向arm-linux系统上的移植,比较核心的技术应该就在makefile上吧,目前自己了解太少,只限于对模板的应用,所以下面的就写不下去了。
下面有一篇到网上找到的关于makefile结构分析的帖子,今后有机会再研究吧。
http://blog.csdn.net/liang13664759/archive/2007/09/04/1771246.aspx
七、学习资料
关于Linux下的Qt开发,在安装了的Fedora里面有相关的本地reference和相关的源码。如:Qt Assistant
关于arm-linux下的Qt开发,安装交叉编译环境时候,也有相关文档和源码:
//**************************************************************************
结语:OK,写到这里了。在上个学期就花过一段时间学习Linux,然后中断了半年,这个学期又进行了深入的学习,把以前的内容和现在的内容串接起来了,终于有了比较清晰一点的思路和体会了,所以总结一下,也让将来的自己再回头学习时有一点借鉴吧。感谢胡师兄的一点一滴的指导。