当前位置:   article > 正文

ARM-Linux构建流程

ARM-Linux构建流程

https://www.cnblogs.com/beer/archive/2011/05/05/2037449.html
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板上直接运行此程序了。

三种系统的职能和联系如下图:
在这里插入图片描述1.2系统平台搭建方式
关于“三系统”的搭建方式,有两种方法:三台分立的单系统机器组合或者一台双系统PC机和一台单系统Arm板机器。

但是不管采用哪种组合方式,各种系统的职能都是一样的,而且都是通过FTP、Telnet或者SSH等网络协议进行文件传输交流。

“三机器”组合模式。将三个系统分别安装在三台机器上并将三台机器组建局域网。

“两机器”组合模式。在PC机上利用虚拟工作站可以同时运行两个系统,虚拟机上的Linux系统基本可以完成所有的实体PC-Linux机器的所有任务,当然也能够组建局域网。

“三机器”组合模式图
在这里插入图片描述“两机器”组合模式图
在这里插入图片描述 如果开发人员对机器性能要求比较高,那么建议采用“三机器”组合模式。因为“两机器”组合模式要求一台机器运行双系统,每个系统都需要分配一定的硬件资源,可能会对每个系统运行的流畅程序都造成影响。

如果开发人员只进行一些简单的程序开发,则建议采用“两机器”组合模式。这样可以节省硬件设备的投资,而且开发环境的搭建、开发的流程等等都会简单一些。而且下面的内容都是基于这种“两机器”组合的开发模式。

二、Linux开发平台搭建
2.1安装虚拟工作站
目前比较流行的虚拟工作站比较多,推荐使用VM-ware WorkStation。建立虚拟工作站的目的就是为了使一台机器同时运行多个不同类型的系统,方便开发人员进行跨平台开发应用程序。

2.2安装Linux虚拟机
安装虚拟机的过程和安装实体机一样,唯一的区别是,虚拟机安装是从VMware中打开并安装的。先准备Linux安装文件,一般可以到网上下载到Linux的iso安装文件,然后从VMware中安装此系统。

2.3虚拟机的一些基本配置
在第一次安装完毕虚拟机后开启虚拟机,默认的分辨率是800*600,同时没有全能共享目录。为了获得比较好的操作界面,同时方便文件共享和转移,需要进行一些基本的配置。

在同一个硬件PC机上运行的两个系统。Windows实体系统用来做一般的用途,比如联网,处理文档等等;Fedora Linux虚拟系统则用来开发Linux程序并进行编译生成可执行文件。

建立共享目录可以方便虚拟机和实体机进行文件交流。例如,我们可以将在Linux机器上编译生成好执行文件放置到共享目录中,然后可以通过Windows机器提取出来并通过网络传送到arm-linux嵌入式板上。

三、Fedora-linux系统
3.1控制终端的基本操作命令
执行系统菜单命令【Applications】–【System Tools】–【Terminal】,打开Terminal终端。
熟悉Windows系统的DOS操作界面的人肯定也会对此操作终端也不会陌生。通过在Terminal中输入命令,用户可以很方便地完成Linux下的一系列操作,在正式进入自主程序设计之前,用户有必要对下面一些最基本命令进行熟悉(其它的命令在项目需要的时候再到网上查找相关资料)。
在这里插入图片描述3.2编程工具简介
如果在安装Fedora的时候,选择的是完全安装,系统会自带很多开发工具。其中Fedora -Eclipse CDT和Qt库及相关设计器Qt Designer是我们今后开发的主要工具。

3.2.1 Fedora-Eclipse CDT
在Fedora中执行系统菜单【Application】–【Programming】–【Eclipse】

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程序
4.1建立控制台程序
4.2建立Linux窗口程序

就像在Window环境下,如果要用C++开发窗口程序,我们一般需要使用Windows API或者MFC。同样,在Linux环境下,我们可能在C++项目中引用Qt库来进行Linux下的窗口程序开发。

编写窗口程序,我们只需要在建立了C++ Project的情况下,对C/C++ Build路径进行设置,指向qt-3.3的库即可。主要开发流程如下:
在这里插入图片描述 第一步:使用Eclipse CDT建立C++ Project。

第二步:设置Build路径指向Qt。在项目管理器中右击项目文件设置项目属性,在C/C++ Build的Settings的Tool Settings中进行设置。

第三步:编写引用了Qt库的C++程序。

第四步:运行程序。

五、使用Eclipse开发Arm-linux程序
5.1 Arm-linux硬件平台

飞凌嵌入式技术公司的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系统上运行了。

1、 将交叉编译工具cross-2.95.3.tar.bz2(可以到网上下载,也可以到开发板附带的光盘资源中找到)通过共享目录传送到Linux系统中,然后在Linux系统终端中先进入其文件目录,然后执行解压命令:

tar xjvf cross-2.95.3.tar.bz2
  • 1

**2、**然后在/usr/local/arm文件目录下可以看到解压后的2.95.3的库了,或者如果你解压的是cross-3.4.1.tar.bz2的版本,那么将会在对应目录下生成3.4.1的目录。

3、 然后设置环境变量。因为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
  • 1

4、 可以通过echo $PATH来查看环境变量是否设置成功:

5.2.3编译并运行程序

在编辑好了代码文件并建立好了交叉编译环境后,就开始编译代码生成可执行程序,并移植到arm板上运行程序。

1、在Linux系统的终端中通过输入arm-linux-gcc/arm-linux-g++来编译C/C++文件。例如,我们对前面编写的最简单的CppHelloWorld.cpp文件进行编译:

arm-linux-g++ CppHelloWorld.cpp –o CppHello
  • 1

在这里插入图片描述2、然后在对应目录下会生成一个可在arm-linux系统上运行的应用程序CppHello。
然后通过SSH服务和FTP服务,将可执行文件从Linux文件系统网络传送到arm-linux文件系统(在此用到了两个小软件SSH Secure和LeapFTP,在后面再对软件的功能进行一下简要介绍)。

在这里插入图片描述 3、然后在Windows机器上远程登录arm-linux系统开发板,并控制程序运行
在这里插入图片描述 注意:需要先通过chmod +x CppHello来告诉系统此文件是可执行文件,然后再通过./CppHello来运行程序。
我们可以看到程序运行的结果:在屏幕上打印出一行字“Hello World”

5.3一些常用的软件介绍
在这里插入图片描述注意:
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。
3.还有一些其它软件,比如小组协作时候,需要使用SVN进行代码管理;还有远程桌面VNC Viewer,可以进行远程桌面控制(但是效果不太好,桌面显示的延时好像比较严重)等等。

5.4开发arm-linux窗口程序
5.4.1建立Qt交叉编译环境

在Linux系统中新建目录/root/yizhi,然后将已经编译好的arm-QT库复制到此目录下面。

1、然后将上面那六个tar.gz压缩文件解压到/root/yizhi目录。

2、在进行arm-linux下的Qt编译的时候,也涉及到环境变量设置问题,所以我们也最好再新建一个账户,专门用于编译arm-Qt程序。

3、例如,在Linux系统终端中添加用户zsm,然后进入到/home/zsm中,对.bash_profile进行修改,设置环境变量:

4、在命令终端中ls –a 显示隐藏的所有文件 找到.bash_profile,输入:

gedit .bash_profile &
  • 1

用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= Q T D I R / l i b : QTDIR/lib: 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++

5、设置好后最好重新登录此账号,然后在终端中输入echo $PATH来检验环境变量是否设置成功:
在这里插入图片描述
6、如果出现上面的输出,则表示arm-linux平台下的Qt交叉编译环境的环境变量已经设置成功。接下来就可以进行Qt程序开发了。

5.4.2编译生成可执行窗体程序

在3.2节中已经写好了一个单文件的项目QtHello,并在项目的src目录下生成了一个QtHello.cpp文件,然后我们要做的就是利用arm-linux下的Qt编译器对其进行编译。

编译Qt窗体项目比编译普通控制台项目要稍微麻烦一点,需要自己写makefile来建立编译规则,编译如上的QtHello.cpp的makefile有如下模板:

#############################################################################

####### 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 = ( S U B L I B S ) − L (SUBLIBS) -L (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,建立多文件的编译规则。
  • 1

6.1多文件控制台项目

多文件的控制台程序的makefile可能会容易一些,自己也没有研究过,以前在使用Magic C++编写C++控制台程序的时候,只需要对Magic C++生成的makefile模块中的编译器进行修改就可以轻松为多文件生成基于arm-linux平台上的控制台程序。(关于如何对Eclipse的makefile模板进行修改,目前还没有研究过,今后有时间研究的话,再补充上吧。)
  • 1

6.2多文件Qt项目

目前只对简单的多文件项目进行了尝试:一个main函数文件,一个窗体头文件,一个窗体实现文件。

6.2.1使用Qt Designer设置界面
1、 在Linux系统中打开Qt Designer,然后进行可视化窗口设计。然后点击保存为mydialog.ui文件 。

2、打开mydialog.ui文件,发现其实只是一个xml文件:
显然这个文件是不能直接被C++项目引用的,需要使用Qt Designer的编译器进行编译,生成和界面对应的h和cpp文件。

3、在Terminal终端里面运行以下命令:

uic xxx.ui -o xxx.h 生成.h文件

uic xxx.ui -i xxx.h -o xxx.cpp 生成.cpp文件
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/316177?site
推荐阅读
相关标签
  

闽ICP备14008679号