Linux及Arm-Linux程序开发笔记(零基础入门篇) css
做者:一点一滴的Beer http://beer.cnblogs.com/html
本文地址:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.htmlmysql
目录linux
1、Arm-Linux程序开发平台简要介绍... 3程序员
1.1程序开发所需系统及开发语言... 3sql
1.2系统平台搭建方式... 4数据库
2、Linux开发平台搭建... 5编程
2.1安装虚拟工做站... 5windows
2.2安装Linux虚拟机... 5浏览器
2.3虚拟机的一些基本配置... 7
2.3.1创建共享目录... 8
2.3.2调整桌面分辨率... 9
2.4安装软件... 11
3、Fedora-linux系统... 11
3.1控制终端的基本操做命令... 12
3.2编程工具简介... 12
3.2.1 Fedora-Eclipse CDT. 13
3.2.2 Qt库及Qt界面设计软件... 14
4、使用Eclipse CDT开发Linux程序... 15
4.1创建控制台程序... 15
4.2创建Linux窗口程序... 16
5、使用Eclipse开发Arm-linux程序... 19
5.1 Arm-linux硬件平台... 19
5.2开发控制台程序... 20
5.2.1使用Eclipse CDT编写代码... 20
5.2.2创建交叉编译环境... 20
5.2.3编译并运行程序... 22
5.3一些经常使用的软件介绍... 23
5.4开发arm-linux窗口程序... 24
5.4.1创建Qt交叉编译环境... 25
5.4.2编译生成可执行窗体程序... 26
6、高级Linux程序设计... 28
6.1多文件控制台项目... 29
6.2多文件Qt项目... 29
6.2.1使用Qt Designer设置界面... 29
6.2.2多文件Qt开发时的一些经典错误... 31
6.3关于makefile. 32
7、学习资料... 32
前言:本文记录了本身从一个彻底不懂Linux的人如何一步步学会Linux程序开发的过程。固然也但愿本文可以达到它的目的,让那些和我同样没有任何基础的人也能快速入门Linux程序开发。
1、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机器的全部任务,固然也可以组建局域网。
“三机器”组合模式图
“两机器”组合模式图
若是开发人员对机器性能要求比较高,那么建议采用“三机器”组合模式。由于“两机器”组合模式要求一台机器运行双系统,每一个系统都须要分配必定的硬件资源,可能会对每一个系统运行的流畅程序都形成影响。
若是开发人员只进行一些简单的程序开发,则建议采用“两机器”组合模式。这样能够节省硬件设备的投资,并且开发环境的搭建、开发的流程等等都会简单一些。并且下面的内容都是基于这种“两机器”组合的开发模式。
2、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,同时没有全能共享目录。为了得到比较好的操做界面,同时方便文件共享和转移,须要进行一些基本的配置。
在同一个硬件PC机上运行的两个系统。Windows实体系统用来作通常的用途,好比联网,处理文档等等;Fedora Linux虚拟系统则用来开发Linux程序并进行编译生成可执行文件。
先须要安装vmware tools
在VMware上面,选择菜单【VM】--【Install VM tools】,而后在Linux虚拟机上会生成目录/media,同时里面产生一个rpm文件。
而后打开控制终端并su登陆超级用户:
cd /media
rpm –ivh 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嵌入式板上。
在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虚拟机安装完毕并进行基本设置后,就能够开始了程序开发环节了。在正式开始程序开发时,还须要对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是咱们从此开发的主要工具。
固然,若是用户没有选择安全安装,则能够到网上下载到各种开发工具的安装文件,并本身进行安装。
在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++进行研究)。
若是只是编写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程序开发的通常方法。
4、使用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程序的开发。
5、使用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系统上除了一些硬件相关度高的应用程序(如驱动程序)以外的绝大部分其它程序的运行环境。
其实和用Eclipse CDT编写Linux环境下的控制台程序是彻底同样。除了在一些特别的场合,好比编写驱动程序,须要注意差异外,其他的功能的实现方法基本上同样。
这方面属于程序设计的基本功,须要长期学习和积累,因此在此再也不多述。
虽然生成程序的源码是同样的,可是在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来查看环境变量是否设置成功:
在编辑好了代码文件并创建好了交叉编译环境后,就开始编译代码生成可执行程序,并移植到arm板上运行程序。
在Linux系统的终端中经过输入arm-linux-gcc/arm-linux-g++来编译C/C++文件。例如,咱们对前面编写的最简单的CppHelloWorld.cpp文件进行编译:
arm-linux-g++ CppHelloWorld.cpp –o CppHello
而后在对应目录下会生成一个可在arm-linux系统上运行的应用程序CppHello。
而后经过SSH服务和FTP服务,将可执行文件从Linux文件系统网络传送到arm-linux文件系统(在此用到了两个小软件SSH Secure和LeapFTP,在后面再对软件的功能进行一下简要介绍)。
而后在Windows机器上远程登陆arm-linux系统开发板,并控制程序运行
注意:须要先经过chmod +x CppHello来告诉系统此文件是可执行文件,而后再经过./CppHello来运行程序。
咱们能够看到程序运行的结果:在屏幕上打印出一行字“Hello World”
5.3一些经常使用的软件介绍
在上面介绍的一些操做中,在进行文件传送的时候用到了一些软件,在此进行简要介绍。
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窗口程序
在Linux系统中新建目录/root/yizhi,而后将已经编译好的arm-QT库复制到此目录下面。
而后将上面那六个tar.gz压缩文件解压到/root/yizhi目录。
在进行arm-linux下的Qt编译的时候,也涉及到环境变量设置问题,因此咱们也最好再新建一个帐户,专门用于编译arm-Qt程序。
例如,在Linux系统终端中添加用户zsm,而后进入到/home/zsm中,对.bash_profile进行修改,设置环境变量:
在命令终端中ls –a 显示隐藏的全部文件 找到.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程序开发了。
在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板上运行的结果了。
6、高级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函数文件,一个窗体头文件,一个窗体实现文件。
在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项目中直接对此文件进行引用,就能够显示对应的窗体了。
经典错误一:
“undefined reference to ……”
这是在引用Qt的库时,产生了某些歧义,须要进行一些预先处理,生成和界面文件相对应的moc文件,关于问题的详细介绍能够参考下面的帖子:
http://hi.baidu.com/asky007/blog/item/7aad95ccbee5ba1601e928d7.html
解决方案:
在Linux控制终端中进入到项目代码文件目录,执行
qmake –project
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,而后中断了半年,这个学期又进行了深刻的学习,把之前的内容和如今的内容串接起来了,终于有了比较清晰一点的思路和体会了,因此总结一下,也让未来的本身再回头学习时有一点借鉴吧。感谢胡师兄的一点一滴的指导。
2011-5-5
于武汉大学
------------------------------------------------------------------
Author:一点一滴的Beer
Email /Gtalk:dreamzsm@gmail.com
From:http://www.cnblogs.com/beer
Notes:欢迎转贴,但请在页面中加个连接注明出处
original:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html