第八章
Download
1 / 161

第八章 LINUX 编程基础 - PowerPoint PPT Presentation


  • 122 Views
  • Uploaded on

第八章 LINUX 编程基础. ◆ 熟悉嵌入式 Linux 系统开发流程 ◆ 掌握构建交叉工具链的方法 ◆ 熟悉 VMWare 与 RedHat9.0 的安装与使用以及配置宿主机的方法 ◆ 熟悉 Shell 与 Makefile 基本用法。. 8 .1 交叉开发环境的建立. 1. 嵌入式 Linux 系统开发流程 嵌入式 Linux 系统的软件结构. 嵌入式 Linux 系统开发流程. 2. 交叉编译概述

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 第八章 LINUX 编程基础' - ondrea


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

第八章 LINUX编程基础


熟悉嵌入式Linux 系统开发流程

◆ 掌握构建交叉工具链的方法

◆ 熟悉VMWare与RedHat9.0的安装与使用以及配置宿主机的方法

◆ 熟悉Shell与Makefile基本用法。


.1 交叉开发环境的建立

1. 嵌入式Linux 系统开发流程

嵌入式Linux 系统的软件结构


嵌入式Linux 系统开发流程


2.交叉编译概述

由于一般嵌入式开发系统存储大小有限,通常都要在PC上建立一个用于目标机的交叉编译环境,完成嵌入式系统的开发。交叉编译环境如下图所示。


有时出于减小libc 库大小的考虑,也可以用别的c库来代替glibc。

例如uClibc 、dietlibc 和newlib。

建立一个交叉编译工具链是一个相当复杂的过程,如果不想自己经历复杂的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载。


GNU的工具链源码包可以到: 库大小的考虑,也可以用别的c库来代替glibc。

http://www.gnu.org上下载,这个网站有很多GNU软件,其中Linux使用的工具链软件是:

Binutils

GCC

GLIBC

GDB


通过这些软件包,可以生成 库大小的考虑,也可以用别的c库来代替glibc。gcc、g++、ar、as、ld等编译链接工具,还可以生成glibc库和gdb调试器。

对于交叉开发工具链来说,从文件名字上加上一个前缀,用来区别本地的工具链,如:arm-linux-gcc,除了体系结构相关的编译选项外,它的使用方法与Linux主机上的gcc相同。所以Linux编程技术对于嵌入式Linux同样适用。


1 库大小的考虑,也可以用别的c库来代替glibc。)Binutils

Binutils是一组针对目标系统的二进制开发工具,包括连接器、汇编器和其他用于目标文件和档案的工具。binutils工具包内容如表:


2 库大小的考虑,也可以用别的c库来代替glibc。)GCC

GCC(GNU Compiler Collection)是编译器,gcc不但能够支持C/C++语言的编译,而且能够支持FORTRAN JAVA ADA等编程语言。对于C/C++语言的完整支持,需要支持glibc库。下表是GCC软件包内容。


使用 库大小的考虑,也可以用别的c库来代替glibc。GCC编译程序时,编译过程可以被细分为四个阶段:

(1)预处理(Pre-Processing)

(2)编译(Compiling)

(3)汇编(Assembling)

(4)链接(Linking)


gcc 库大小的考虑,也可以用别的c库来代替glibc。最基本的用法是∶

gcc [options] [filenames]

options:编译器所需要的编译选项

filenames:要编译的文件名。


编译选项: 库大小的考虑,也可以用别的c库来代替glibc。

gcc编译器的编译选项大约有100多个,其中多数我们根本就用不到,这里只介绍其中最基本、最常用的参数。

-o output_filename:确定可执行文件的名称为output_filename。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

-c:只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。


-g 库大小的考虑,也可以用别的c库来代替glibc。:产生调试工具(GNU的gdb)所必要的符号信息,要想对编译出的程序进行调试,就必须加入这个选项。

-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。

-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。


3 库大小的考虑,也可以用别的c库来代替glibc。)GLIBC

Glibc库是提供系统调用和基本函数的C库,可以编译生成静态库和动态库。完整的GCC需要支持glibc库。一般存放在/lib和/usr/lib目录中。Glibc库的工具如表。


4)GDB 库大小的考虑,也可以用别的c库来代替glibc。

作为GNU的成员之一,GDB(GNU Debug)也是免费的。GDB可以调试C和C++语言程序,功能非常强大。GDB主要完成下面三个方面的功能:

(1)启动被调试程序。

(2)让被调试的程序在指定的位置停住。

(3)当程序被停住时,可以检查程序状态(如变量值)。

启动GDB方法:

gdb 调试程序名

例:gdb helloworld


例如: 库大小的考虑,也可以用别的c库来代替glibc。

#include<stdio.h>

void main()

{

int i;

long result=0;

for(i=1;i<=100;i++)

{

result+=i;

}

printf("result=%d\n",result);

}


(1)编译生成可执行 库大小的考虑,也可以用别的c库来代替glibc。

gcc-g tst.c

(2)启动GDB

gdb tst

(3)在main函数处

break main

(4)运行程序

run

(5)单步运行

next

(6)继续运行

Continue


5 库大小的考虑,也可以用别的c库来代替glibc。) Crosstool

Crosstool软件实际上是一个脚本,用于编译和测试大多数体系结构的各gcc和glibc的版本组合。从crosstool网站上可以下载到这些编译脚本。它包含了体系结构和gcc和glibc各种组合配置的最小补丁。


Binutils 库大小的考虑,也可以用别的c库来代替glibc。、gcc和glibc的版本需要匹配,越新的版本功能越强大,但是最新版本有可能有存在BUG。这需要不断地测试修正。

对于gcc来说,2.95.x曾经统治了Linux2.4内核时代,它表现得极为稳定。

随着内核的升级,Linux2.6内核需要更高的工具链版本来支持。所以Linux2.6内核最好用gcc3.3以上的版本。


8.1.3 库大小的考虑,也可以用别的c库来代替glibc。构建交叉工具链

构建交叉编译器首先就是确定目标平台。

在GNU系统中,每个目标平台都有一个明确的格式,这些信息用于在构建过程中识别要使用的不同工具的正确版本。


当在一个特定目标机下运行GCC时,GCC便在目录路径中查找包含该目标规范的应用程序路径。GNU的目标规范格式为CPU-PLATFORM-OS。

例如x86/i386 目标机名为i686-pc-linux-gnu。

本章的目的是讲述建立基于ARM平台的交叉工具链,所以目标平台名为arm-linux-gnu。


通常构建交叉工具链有3种方法 当在一个特定目标机下运行GCC时,GCC便在目录路径中查找包含该目标规范的应用程序路径。GNU的目标规范格式为CPU-PLATFORM-OS。

方法一:

分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。

该方法相对比较困难,适合想深入学习构建交叉工具链的读者。如果只是想使用交叉工具链,建议使用方法二或方法三构建交叉工具链。


方法二: 当在一个特定目标机下运行GCC时,GCC便在目录路径中查找包含该目标规范的应用程序路径。GNU的目标规范格式为CPU-PLATFORM-OS。

通过Crosstool脚本工具来实现一次编译生成交叉编译工具链,该方法相对于方法一要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。


方法三: 当在一个特定目标机下运行GCC时,GCC便在目录路径中查找包含该目标规范的应用程序路径。GNU的目标规范格式为CPU-PLATFORM-OS。

直接通过网上(ftp.arm.kernel.org.uk)下载已经制作好的交叉编译工具链。

该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是固定的没有灵活性,所以构建所用的库以及编译器的版本也许并不适合自己要编译的程序,同时也许会在使用时出现许多莫名的错误,建议读者慎用此方法。


1. 当在一个特定目标机下运行GCC时,GCC便在目录路径中查找包含该目标规范的应用程序路径。GNU的目标规范格式为CPU-PLATFORM-OS。分步构建交叉编译链

就是一步一步地建立交叉编译链。下面尽可能详细地介绍构建的每一个步骤,读者完全可以根据本节的内容自己独立实践,构建自己的交叉工具链。通过实践可以使读者更加清楚交叉编译器的构建过程以及各个工具包的作用。该方法所需资源如表8.1.7所示。


1)建立工作目录 当在一个特定目标机下运行GCC时,GCC便在目录路径中查找包含该目标规范的应用程序路径。GNU的目标规范格式为CPU-PLATFORM-OS。

工作目录就是在什么目录下构建交叉工具链,目录的构建一般没有特别的要求,可以根据个人喜好建立。

# cd /my2410

# mkdir armlinux


在工作目录armlinux下建立3个目录 build-tools、kernel 和 tools。具体操作如下:

# cd armlinux

# mkdir build-tools kernel tools

其中各目录的作用如下。

(1)build-tools:用来存放下载的binutils、gcc、glibc等源代码和用来编译这些源代码的目录;

(2)kernel:用来存放内核源代码;

(3)tools:用来存放编译好的交叉编译工具和库文件。


2 build-tools、kernel 和 tools。具体操作如下:)建立环境变量

该步骤的目的:方便重复输入路径

声明以下环境变量的目的是在之后编译工具库的时候会用到,很方便输入,尤其是可以降低输错路径的风险。


# export PRJROOT=/home/mike/armlinux build-tools、kernel 和 tools。具体操作如下:

# export TARGET=arm-linux

# export PREFIX=$PRJROOT/tools

# export TARGET_PREFIX=$PREFIX/$TARGET

# export PATH=$PREFIX/bin:$PATH

注意,用export声明的变量是临时的变量 ,如果还需要使用这些环境变量就必须重复export操作。

环境变量也可以定义在bashrc文件中,这样当注销或更换控制台时,这些变量就一直有效,就不用总是export这些变量了。


3 build-tools、kernel 和 tools。具体操作如下:)编译、安装Binutils

Binutils是GNU工具之一,它包括连接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。

安装Binutils工具包含的程序有addr2line、ar、as、c++filt、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、strings、strip、libiberty、libbfd和libopcodes。


Binutils build-tools、kernel 和 tools。具体操作如下:工具安装依赖于:

Bash、Coreutils、Diffutils、GCC、Gettext、Glibc、Grep、Make、Perl、Sed、Texinfo等工具。


下面将分步介绍安装 build-tools、kernel 和 tools。具体操作如下:binutils-2.15的过程。

首先解压binutils-2.15.tar.bz2包,命令如下:

# cd $PRJROOT/build-tools

# tar –xjvf binutils-2.15.tar.bz2


接着配置Binutils工具,建议建立一个新的目录用来存放配置和编译文件,这样可以使源文件和编译文件独立开,具体操作如下: 接着配置Binutils工具,建议建立一个新的目录用来存放配置和编译文件,这样可以使源文件和编译文件独立开,具体操作如下:

# cd $PRJROOT/build-tools

# mkdir build-binutils

# cd build-binutils

# ../ binutils-2.15/configure --target=$TARGET --prefix=$PREFIX


其中: 接着配置Binutils工具,建议建立一个新的目录用来存放配置和编译文件,这样可以使源文件和编译文件独立开,具体操作如下:

–target的含义是制定生成的是 arm-linux 的工具

--prefix 是指出可执行文件安装的位置。执行上述操作会出现很多check信息,最后产生 Makefile 文件。

接下来执行make和安装操作,命令如下:

# make

# make install


该编译过程较慢,需要数十分钟,安装完成后查看/my2410/armlinux/tools/bin目录下的文件,如果查看结果如下,表明此时Binutils工具已经安装结束。

# ls $PREFIX/bin

arm-linux-addr2line arm-linux-ld arm-linux-ranlib arm-linux-strip arm-linux-ar arm-linux-nm arm-linux-readelf arm-linux-as arm-linux-objcopy arm-linux-size arm-linux-c++filt

arm-linux-objdump arm-linux-strings


4 该编译过程较慢,需要数十分钟,安装完成后查看/my2410/armlinux/tools/bin目录下的文件,如果查看结果如下,表明此时Binutils工具已经安装结束。)获得内核头文件

编译器需要通过系统内核的头文件来获得目标平台所支持的系统函数调用所需要的信息。对于Linux内核,最好的方法是下载一个合适的内核,然后复制获得头文件。需要对内核做一个基本的配置来生成正确的头文件;不过,不需要编译内核。


对于本例中的目标 该编译过程较慢,需要数十分钟,安装完成后查看/my2410/armlinux/tools/bin目录下的文件,如果查看结果如下,表明此时Binutils工具已经安装结束。arm-linux,需要以下步骤。

(1)在kernel目录下解压linux-2.6.30.4.tar.gz内核包,执行命令如下:

# cd $PRJROOT/kernel

# tar –xvzf inux-2.6.30.4.tar.gz

(2)接下来配置编译内核使其生成正确的头文件,执行命令如下:

# cd linux-2.6.30.4

# make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig


其中: 该编译过程较慢,需要数十分钟,安装完成后查看/my2410/armlinux/tools/bin目录下的文件,如果查看结果如下,表明此时Binutils工具已经安装结束。

ARCH=arm表示是以arm为体系结构

CROSS_COMPILE=arm-linux-表示是以arm-linux-为前缀的交叉编译器

可以用config和xconfig来代替menuconfig,推荐用make menuconfig。

注意在配置时一定要选择处理器的类型,这里选择三星的S3C2410(System Type->ARM System Type->SMDK2410/ARM920T),如下图所示。


该编译过程较慢,需要数十分钟,安装完成后查看/my2410/armlinux/tools/bin目录下的文件,如果查看结果如下,表明此时Binutils工具已经安装结束。8.1.5 Linux 2.6.30内核配置界面


配置完退出并保存。 该编译过程较慢,需要数十分钟,安装完成后查看/my2410/armlinux/tools/bin目录下的文件,如果查看结果如下,表明此时Binutils工具已经安装结束。

检查一下内核目录中的include/linux/version.h和include/linux/autoconf.h文件是不是生成了,这是编译glibc时要用到的,如果version.h 和 autoconf.h 文件存在,说明生成了正确的头文件。


复制头文件到交叉编译工具链的目录,首先需要在/home/mike/armlinux/tools/arm- linux目录下建立工具的头文件目录inlcude,然后复制内核头文件到此目录下。具体操作如下:

# mkdir –p $TARGET_PREFIX/include

# cp –r $PRJROOT/kernel/linux-2.6.30.4/include/linux $TARGET_PREFIX/include

# cp –r $PRJROOT/kernel/linux-2.6.30.4/include/asm-arm $TARGET_PREFIX/include/asm


5) linux目录下建立工具的头文件目录inlcude,然后复制内核头文件到此目录下。编译安装boot-trap gcc

主要是建立arm-linux-gcc工具,注意这个gcc没有glibc库的支持,所以只能用于编译内核、BootLoader等不需要C库支持的程序。

后面创建C库也要用到这个编译器,所以创建它主要是为创建C库做准备,如果只想编译内核和BootLoader,那么安装完这个就可以到此结束。


安装命令如下: linux目录下建立工具的头文件目录inlcude,然后复制内核头文件到此目录下。

# cd $PRJROOT/build-tools

# tar –xvzf gcc-3.3.6.tar.gz

# mkdir build-gcc

# cd gcc-3.3.6

# vi gcc/config/arm/t-linux


由于是第一次安装 linux目录下建立工具的头文件目录inlcude,然后复制内核头文件到此目录下。ARM交叉编译工具,没有支持libc库的头文件,所以在gcc/config/arm/t- linux文件中给变量 TARGET_LIBGCC2_CFLAGS增加操作参数选项-Dinhibit_libc -D__gthr_ posix_h来屏蔽使用头文件,否则一般默认会使用/usr/inlcude头文件。


将TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer –fPIC改为:

TARGET_ LIBGCC2- CFLAGS=-fomit-frame-pointer–fPIC -Dinhibit_libc -D__gthr_posix_h

修改完t-linux文件后保存,紧接着执行配置操作


如下命令: –fPIC改为:

# cd build-gcc

# ./ build-gcc /configure --target=$TARGET --prefix=$PREFIX --enable-languages=c

--disable-threads --disable-shared

其中选项:

--enable-languages=c表示只支持C语言

--disable-threads表示去掉thread功能,这个功能需要glibc的支持。

--disable-shared表示只进行静态库编译,不支持共享库编译。


接下来执行编译和安装操作,命令如下: –fPIC改为:

# make

# make install

安装完成后,在/home/mike/armlinux/tools/bin下查看,如果arm-linux-gcc等工具已经生成,表示boot-trap gcc工具已经安装成功。


6) –fPIC改为:建立glibc库

glibc是GUN C库,它是编译Linux系统程序很重要的组成部分。

安装glibc-2.3.2版本之前推荐先安装以下的工具:

(1) GNU make 3.79或更新;

(2) GCC 3.2或更新;

(3) GNU binutils 2.13或更新。


首先解压 –fPIC改为:glibc-2.2.3.tar.gz和glibc-linuxthreads-2.2.3.tar.gz源代码

操作如下:

# cd $PRJROOT/build-tools

# tar -xvzf glibc-2.2.3.tar.gz

# tar -xzvf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3


然后进行编译配置, –fPIC改为:glibc-2.2.3配置前必须新建一个编译目录,否则在glibc-2.2.3目录下不允许进行配置操作,此处在$PRJROOT/build-tools目录下建立名为build-glibc的目录,配置操作如下:

# cd $PRJROOT/build-tools

# mkdir build-glibc

# cd build-glibc

# CC=arm-linux-gcc ../glibc-2.2.3 /configure -- host=$TARGET --prefix="/usr"--enable-add-ons --with-headers=$TARGET_PREFIX/include


选项 –fPIC改为:CC=arm-linux-gcc是把CC(Cross Compiler)变量设成刚编译完的gcc,用它来编译glibc。

--prefix=“/usr”定义了一个目录用于安装一些与目标机器无关的数据文件,默认情况下是/usr/local目录。

--enable-add-ons是告诉glibc用linuxthreads包,在上面已经将它放入glibc源代码目录中,这个选项等价于-enable-add-ons=linuxthreads。

--with-headers告诉glibc linux内核头文件的目录位置。


配置完后就可以编译和安装 –fPIC改为:glibc了,具体操作如下:

# make

# make install


7) –fPIC改为:编译安装完整的gcc

由于第一次安装的gcc没有交叉glibc的支持,现在已经安装了glibc,所以需要重新编译来支持交叉glibc。并且上面的gcc也只支持C语言,现在可以让它同时支持C语言还要和C++语言。具体操作如下:

# cd $PRJROOT/build-tools/gcc-2.3.6

# ./configure --target=arm-linux --enable-languages=c,c++ --prefix=$PREFIX

# make

# make install

安装完成后会发现在$PREFIX/bin目录下又多了arm-linux-g++ 、arm-linux-c++等文件。


8) –fPIC改为:测试交叉编译工具链

到此为止,已经介绍完了用分步构建的方法建立交叉编译工具链。

写一个最简单的hello.c源文件,内容如下:

#include <stdio.h>

int main( )

{

printf(“Hello,world!\n”);

return 0;

}


通过以下命令进行编译,编译后生成名为 –fPIC改为:hello的可执行文件,通过file命令可以查看文件的类型。

当显示以下信息时表明交叉工具链正常安装了,通过编译生成了ARM体系可执行的文件。

注意,通过该交叉编译链编译的可执行文件只能在ARM体系下执行,不能在基于X86的普通PC上执行。


# arm-linux-gcc –o hello hello.c –fPIC改为:

# ./hello

hello: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.4.3,

dynamically linked (uses shared libs), not stripped

注意:当我们执行生成的hello时,它是针对arm平台,所以出现上述问题而不可以执行


2. –fPIC改为:用Crosstool工具构建交叉工具链

Crosstool是一组脚本工具集,可构建和测试不同版本的gcc和glibc,用于那些支持glibc的体系结构。它也是一个开源项目,下载地址是http://kegel.com/crosstool。

用Crosstool构建交叉工具链要比上述的分步编译容易得多,并且也方便许多,对于仅仅为了工作需要构建交叉编译工具链的读者建议使用此方法。用Crosstool工具构建所需资源如下表所示。


1 –fPIC改为:)下载资源文件

首先从网上下载上述资源文件:binutils-2.15.tar.bz2,gcc-3.4.5.tar.bz2,glibc- 2.3.6.tar.bz2 ,glibc-linuxthreads-2.3.6.tar.bz2,linux-2.6.28.2.tar.bz2和linux-libc-headers- 2.6.12.0.tar.bz2。


然后将这些工具包文件放在开放主机的/opt/my2410/down目录下,

最后在/opt/my2410目录下解压crosstool-0.43.tar.gz,命令如下:

# cd /opt/my2410

# tar –xvzf crosstool-0.43.tar.gz


2)建立脚本文件 然后将这些工具包文件放在开放主机的/opt/my2410/down目录下,

在crosstool文件夹中,可以看到目录下有很多.sh脚本和.dat配置文件。找到要交叉编译的CPU所对应的脚本,如要交叉编译的CPU是S3C2410A,则选用demo-arm- softfloat.sh(支持浮点运算,编译高版本的UBOOT时需要这项支持)


将执行crosstool-0.43目录下的demo-arm-softfloat.sh脚本进行编译,具体操作如下:

# cd crosstool-0.43

# vi demo-arm-softfloat.sh修改后的demo-arm-softfloat.sh的脚本内容如下:


3 将执行crosstool-0.43目录下的demo-arm-softfloat.sh脚本进行编译,具体操作如下:)建立配置文件

在 arm.sh 脚本文件中需要注意 arm.dat 和 gcc-3.4.5-glibc-2.3.6.dat 两个文件,这两个文 件是作为 crosstool 的编译的配置文件。其中 arm.dat 文件内容如下,主要用于定义配置文件 , 定译生成编译工具链的名称以及定义编译选项等。


4)执行脚本 将执行crosstool-0.43目录下的demo-arm-softfloat.sh脚本进行编译,具体操作如下:

将Crosstool 的脚本文件和配置文件准备好之后,开始执行demo-arm-softfloat.sh

脚本来编译交叉编译工具。具体执行命令如下:

[[email protected] crosstool-0.43]# cd crosstool-0.43

[[email protected] crosstool-0.43]# ./demo-arm-softfloat.sh

编译数小时后,将在/opt/crosstool目录下生成gcc-3.4.5- glibc-2.3.6的子目录,交叉编译器、库、头文件都包含里面。


经过数小时的漫长编译之后,会在/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin 目录下生成新的交叉编译工具,其中包括以下内容:


5)添加环境变量 经过数小时的漫长编译之后,会在/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin 目录下生成新的交叉编译工具,其中包括以下内容:

安装上述生成的gcc-3.4.5- glibc-2.3.6交叉工具链,如下所示:


export PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin:$PATH

设置完环境变量,也就意味着交叉编译工具链已经构建完成 。


8.1.4 PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin:$PATH 嵌入式Linux开发环境组建方案

在进行嵌入式开发之前,首先要建立一个交叉编译环境,包括操作系统以及连接器、编译器、调试器在内的软件开发工具。

个人在进行嵌入式开发的时候,可分别建立以LINUX为操作系统的开发环境或者在Windows下安装模拟Linux环境的软件(VMware Workstation、Cygwin)。


在进行的某项目开发如果有多名工程师组成,不可能每人安装建立一套开发环境,也难以控制版本的一致性,造成不必要的麻烦。最好的解决办法就是架设一台LINUX服务器,项目开发的工程师可以通过客户端使用Telnet或SSH登陆服务器,开发板也可以连接在同一局域网内。在进行的某项目开发如果有多名工程师组成,不可能每人安装建立一套开发环境,也难以控制版本的一致性,造成不必要的麻烦。最好的解决办法就是架设一台LINUX服务器,项目开发的工程师可以通过客户端使用Telnet或SSH登陆服务器,开发板也可以连接在同一局域网内。



1. Windows+ Linux +目标系统

安装多个操作系统,可以解决问题,但是,如果在调试应用程序的时候,同时需要两个操作系统,则需要在两个系统之间来回切换,这样很繁琐,很浪费时间。


2. Windows+cygwin+目标系统

Cygwin是一个运行于Windows下的Linux模拟环境。但是,在使用某些特殊功能的时候,需要打一些补丁,对于初学者来说,比较困难。


3. Windows+虚拟机(Linux) +目标系统

Vmware可以在不破坏原有操作系统的情况下,虚拟出一台“真实”的电脑出来,我们只需要在这台虚拟的电脑上安装Linux就可以了,和操作真实机器上的Linux完全一样。对于初学者这是一个不错的选择方案。


4.Windows+Linux服务器 +目标系统

Windows客户机+Linux服务器的方式,对实验室而言,应该是最适合的方案了。只需多一台Linux服务器就可以了,对客户机和服务器的硬件要求都不没有什么特殊高要求。


8.1.5 VMWare 的安装与使用

GCC for ARM主要是基于Linux系统的,所以在安装它之前必须要安装Linux系统。

不这里推荐使用Windows+虚拟机VMware + RedHat的配置方案。


共分三步来完成GCC交叉开发环境的配置:

1)在Windows系统上安装虚拟机软件VMware。

2)在VMware中安装并配置RedHat。

3)在RedHat中安装并配置GCC forARM。


VMWare Workstation 软件可以从http://www.crsky.com/soft/1863.html下载, 它是一个不错的虚拟机,能够在Windows环境中虚拟一个Linux操作系统,目前能下载到5.0以上的版本。同时还需要下载Linux相关的ISO映象文件。


8.1.6 安装RedHat9.0

在VMware中安装并配置RedHat。

1)打开VMware workstation,运行虚拟机。

2)建立一台虚拟机。点击“FILE(文件)”-“NEW(新建)”--“NewVirtual Machine(新建虚拟机)”,弹出虚拟机创建菜单。

3)选择客户操作系统。因为要装的是Redhat,所以这里选择Linux。

配置好一个新的虚拟机后,双击CD-ROM1。如下图所示。


选择 Use ISO image,然后点Browse,选择RedHat和第一张光盘,一般采用的是Redhat的镜像安装方式。

为了以后使用网络方便,在安装过程出现防火墙配置时,这里选择“无防火墙”一直点“下一步”。


直到出现下图,输入根口令用 123456,确认也填123456。

至此,系统的基本参数已经设置完,点“下一步”,开始安装系统。


在以后的安装过程中,按屏幕给出的提示,把不同的LINUX安装盘的ISO加载进VMware就可以了。具体过程是:

1)出现 提示符时,打开虚拟机菜单面板,如图8.1.10所示。


2 在以后的安装过程中,按屏幕给出的提示,把不同的)修改ISO image的路径

如图8.1.11所示。


3 在以后的安装过程中,按屏幕给出的提示,把不同的)设置共享目录,选择Options中的Shared Folders,如图8.1.12所示。


4 在以后的安装过程中,按屏幕给出的提示,把不同的)共享目录建立完成后,就可以将Windows硬盘中的文件拷贝到到建立的共享目录,在虚拟环境里,然后再次拷贝到LINUX目录下。

打开“终端”, 在终端方式下,输入下列命令:

[[email protected] root]# cd mnt

[[email protected]]# cd hgfs

[[email protected] cdrom]# cd zxl //建立的共享目录

[[email protected] linux]# cp vivi.tar.gz / //拷贝文件到根目录

[[email protected] linux]# cd / //回到根目录

[[email protected] /]#tar -zxvf vivi.tar.gz //解压vivi.tar.gz包

[[email protected] /]#cd /vivi //进入//zxl2410目录。

然后就可以对文件进行操作,为以后的开发提供了方便。


8.1.7 配置宿主机 在以后的安装过程中,按屏幕给出的提示,把不同的

1. 配置minicom

minicom很像Windows下面的超级终端,我们利用minicom作为被开发目标板的终端,开发前需要正确的配置minicom。

在宿主机Linux系统下的终端中输入:

minicom -s

对minicom进行设置。


选择Serial port setup,将串口配置为:波特率115200,8位数据位,1位停止位,没有流控和校验。并将其设置存为默认值。

选择Save setup as dfl。

然后选择Exit退回到minicom界面。

正确连接串口线,PC机端使用在minicom中被配置的串口,ttyS0或ttyS1。目标板请使用串口0。

minicom 就相当于虚拟终端,通过它来操作目标板。


如下图所示为minicom启动后的状态。 setup,将串口配置为:波特率115200,8位数据位,1位停止位,没有流控和校验。并将其设置存为默认值。如果要退出minicom,可以先按CTRL+A键,再按X键。按CTRL+A再按Z为进入帮助。


2. 配置TFTP setup,将串口配置为:波特率115200,8位数据位,1位停止位,没有流控和校验。并将其设置存为默认值。

TFTP的全称是Trivial File Transfer Protocol,即简单文件传输协议。使用此服务传送文件时没有数据校验、密码验证,非常适合小型文件的传输。在通过TFTP传送文件时,需要服务端和客户端,对于嵌入式系统来讲,服务端就是宿主机,下边来对它进行配置。


首先检查宿主机端的TFTP 服务是否已经开通。对于REDHAT7.2 以上的版本,如REDHAT9.0,则在宿主机上执行:

setup

选择System services,将tftp一项选中,出现[*]表示选中,并去掉ipchains 和iptables 两项服务,即去掉它们前面的*号。

然后还要选择Firewall configuration,选中No firewall。最后,退出setup,执行如下命令以启动TFTP 服务:


service xinetd restart 服务是否已经开通。对于REDHAT7.2 以上的版本,如REDHAT9.0,则在宿主机上执行:

配置完成后,简单测试一下TFTP 服务器是否可用,即自己tftp自己,例如在宿主机上执行:

cp /s3c2410_linux/Image/zImage /tftpboot/ /*在本地准备一个文件*/

tftp 192.168.2.xxx /*用tftp服务登陆本机*/

tftp>get zImage /*使用tftp服务得到zImage*/

tftp>q /*退出tftp服务*/


若出现信息“Received 741512 bytes in 0.7 seconds”就表示TFTP 服务器配置成功了。若弹出信息“Timed out”,则表明未成功。此时可用如下命令确认tftp 服务是否开通:

netstat -a|grep tftp

若TFTP 服务器没有配置成功,需要按照上述步骤重新检查一遍。


3. 配置NFS服务 seconds”就表示TFTP 服务器配置成功了。若弹出信息“Timed out”,则表明未成功。此时可用如下命令确认tftp 服务是否开通:

NFS(Network File System,NFS)指网络文件系统,它是Linux系统中经常使用的一种服务,NFS是一个RPC service,很像windows中的文件共享服务。它的设计是为了在不同的系统间使用, 所以它的通讯协议设计与主机及作业系统无关。当使用者想用远端档案时只要用"mount"就可把remote档案系统挂接在自己的档案系统之下,使得远端的档案在使用上和local的档案没两样。


在NFS服务中,宿主机(Servers)是被挂载(mount)端,为了远端客户机(Clients)可以访问主机的文件,我们需要主机配置两方面内容:在NFS服务中,宿主机(Servers)是被挂载(mount)端,为了远端客户机(Clients)可以访问主机的文件,我们需要主机配置两方面内容:

打开NFS服务,允许“指定用户”使用。


打开宿主机的NFS服务可以使用命令:在NFS服务中,宿主机(Servers)是被挂载(mount)端,为了远端客户机(Clients)可以访问主机的文件,我们需要主机配置两方面内容:

setup

选择System services,将nfs一项选中,出现[*]表示选中,并去掉ipchains 和iptables 两项服务,即去掉它们前面的*号。然后退出。

“指定用户”是通过编辑文件“exports”:

vi /etc/exports

在exports文件中加入:

/s3c2410_linux/nfs 192.168.0.16(rw,insecure,no_root_squash,no_all_squash)


然后按<ESC> 再输入 : 再输入wq 然后回车,存储退出。其中“/s3c2410_linux/nfs”是一个可以被IP地址是“192.168.0.16”计算机访问到并读写的文件夹。

可以更改这个ip,可以让不同的计算机访问。重新启动服务,使我们的设置生效:

/etc/rc.d/init.d/nfs restart

现在NFS就可以使用了。

要启动或停止NFS服务,必须以root登录并使用以下命令来启动 NFS 守护进程,其命令格式如下:

/etc/rc.d/init.d/nfs start stop restart


要启动NFS,在“#”提示符下键入以下命令行:

/etc/rc.d/init.d/nfs start

注:在Linux的Terminal下,可以使用ifconfig命令来给设定本机ip。例如:

# ifconfig eth0 192.168.0.xxx

同样在minicom中也可以用该命令给实验箱设置ip地址。宿主机和开发板ip要配成同一网段内的。在exports文件中设置宿主机可以被访问的文件目录,和开发板的ip地址,就可以在minicom下,让开发板通过网络挂接(mount)到宿主机的相应文件夹。


4. Samba 要启动NFS,在“#”提示符下键入以下命令行:

Linux与Linux之间通过NFS实现共享,Windows与windows之间通过共享目录实现共享,Linux与windows之间怎么实现共享?利用Samba实现共享。

一个Samba服务器实际上包括两个守护进程:smbd和nmbd。

Samba服务器配置工具如图8.1.14所示,它是用来管理Samba共享、用户以及基本服务器设置的图形化界面。

配置Samba服务器首先是配置服务器的基本设置和几个安全选项。然后添加Samba用户、添加共享。


启动和停止Samba服务器,使用以下命令来启动守护进程:启动和停止Samba服务器,使用以下命令来启动守护进程:

/etc/rc.d/init.d/smb start

使用以下命令来停止守护进程:

/etc/rc.d/init.d/smb stop


连接Samba共享:启动和停止Samba服务器,使用以下命令来启动守护进程:

要从Microsoft Windows机器上连接Linux Samba共享,可以使用“网上邻居”或图形图形化化文件管理器。也可用以下DOS命令:\\192.168.0.221。

smbclient命令用来存取远程Samba服务器上的资源。


8启动和停止Samba服务器,使用以下命令来启动守护进程:.2Shell脚本

8.2.1 什么是shell

Linux系统的Shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。Shell是用户和操作系统之间最主要接口。通过Shell,可以同时在后台运行多个应用程序,并且在把需要与用户交互的程序放在前台运行。

用户、Shell以及与Linux 操作系统内核的关系如下图所示。


1. Shell称为命令解释器启动和停止Samba服务器,使用以下命令来启动守护进程:

负责用户和操作系统之间的沟通,把用户下达的命令解释给系统去执行,并将系统传回的信息再次解释给用户,所以,它拥有自己内建的Shell命令集,也能被系统中其他应用程序调用。

2. Shell还是一种高级程序设计语言

它有变量、关键字,有各种控制语句,如if、case、while、for等语句,通过在多条命令的序列中使用变量和流程控制,有自己的语法结构。利用Shell程序设计语言可以编写出功能强大的代码程序。


3、Shell有很多种启动和停止Samba服务器,使用以下命令来启动守护进程:

Shell有很多种,如:csh,tcsh,pdksh, ash, sash, zsh,bash等。

Linux的缺省Shell为bash(Bourne Again Shell)。其中最常见的是Bourne Shell(sh)、C Shell(csh)和Korn Shell(ksh)。三种Shell各有优缺点。


三种Shell各有优缺点。启动和停止Samba服务器,使用以下命令来启动守护进程:

1)Bourne Shell是Unix最初始的Shell,并且在每种Unix上都可以使用。Bourne Shell在Shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种Shell。

2)Bash(Bourne Again Shell)是Bourne Shell的扩展,与Bourne Shell完全向下兼容,并且增加了许多特性。它还包含了很多C Shell和Korn Shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。


Bash是大多数Linux系统的默认Shell。Bash有以下的优点:

1)补全命令

在Bash命令提示符下输入命令或程序名时,若没有输全命令或程序名,按“Tab”键,Bash将自动补全命令或程序名。

2)通配符

在Bash下可以使用通配符“*”和“?”。“*”可以替代多个字符,而“?”则替代一个字符。

3)历史命令

Bash能自动跟踪用户每次输入的命令,并把输入的命令保存在历史列表缓冲区中。


4)别名 Bash是大多数Linux系统的默认Shell。Bash有以下的优点:

在Bash下,可用alias和unalias命令给命令或可执行程序起别名和删除别名,这样就可以用自己习惯的方式输入命令。

5)输入/输出重定向。

输入重定向用于改变命令的输入,输出重定向用于改变命令的输出系统默认的输入为键盘、输出为显示器 ,输入/输出重定向可以改变输入输出。

6)管道

管道用于将一系列的命令连接起来,也就是把前面命令的输出作为后面命令的输入。管道的命令是“|”。管道的功能和用法与DOS/Windows系统的完全相同。


例如: Bash是大多数Linux系统的默认Shell。Bash有以下的优点:

cat dir.out|grep "test "|wc –l

命令演示:

last

last |grep root

last |grep root |wc -l


8.2.2 Shell脚本编程 Bash是大多数Linux系统的默认Shell。Bash有以下的优点:

由于Shell擅长系统管理任务,所以用户可以通过使用Shell使大量的任务自动化,就象使用DOS操作系统的过程当中,会执行一些重复性的命令,将这些大量的重复性的命令写成批处理命令,通过执行这个批处理命令来代替执行重复性的命令。在Linux系统中也有类似的批处理命令,被称为Shell脚本。


1.建立脚本 Bash是大多数Linux系统的默认Shell。Bash有以下的优点:

使用vi、Emacs等编Shell脚本。Linux系统下的Shell默认Bash。

在建立Shell脚本程序的开始,首先应指明使用哪种Shell来解释所写的脚本,第一行必须是如下格式:

#! /bin/sh


符号#!用来指定该脚本文件的解析程序。在上面例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。可以利用下面的语句改变文件的属性为可执行属性。

chmod+x filename

在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。


2.Shell变量 符号#!用来指定该脚本文件的解析程序。在上面例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。可以利用下面的语句改变文件的属性为可执行属性。

Shell脚本中主要有系统变量、环境变量和用户变量,其中用户变量在编程过程中使用较多,系统变量在对参数判断和命令返回值判断会使用,环境变量主要是在程序运行的时候需要设置,由于是解释型的,所以变量不必事先对它进行定义。

1)常用的环境变量

在用户登录过程中系统要做的一件事就是建立用户环境,就是Shell 下的控制及设置,包括文件搜索路径、用户目录和系统提示符等。Linux(Shell)环境由许多变量和这些变量的值组成,通过设置这些环境变量来控制用户环境。


符号#!用来指定该脚本文件的解析程序。在上面例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。可以利用下面的语句改变文件的属性为可执行属性。1)HOME:用户主目录的全路径名。主目录是开始工作的位置,默认情况下,普通用户的主目录为/home/用户名,root用户的主目录为/root。

例如:如果你的用户名为myname,则HOME的值为/home/myname。不管你当前路径在哪里,都可以通过命令cd $HOME返回到主目录。在Linux系统中用~(波浪线)表示用户的主目录。

要使用环境变量或其他Shell变量,必须在变量名前加上一个“$”符号而不能直接使用变量名。


(2)LOGNAME 符号#!用来指定该脚本文件的解析程序。在上面例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。可以利用下面的语句改变文件的属性为可执行属性。

用户名(注册名),由Linux自动设置,系统通过与LOGNAME变量确认文件的所有者,有权执行某个命令等。

(3)PATH

Shell从中查找命令的目录列表。PATH变量包含有带冒号分界符的字符串,这些字符串指向含有你所使用命令的目录。PATH变量中的字符串顺序决定了先从哪个目录查找。PATH环境变量的功能和用法与DOS/Windows系统的几乎完全相同。

例如:

PATH=$PATH:$HOME/bin


(4)PS1 符号#!用来指定该脚本文件的解析程序。在上面例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。可以利用下面的语句改变文件的属性为可执行属性。

Shell的主提示符,既在Shell准备接受命令时显示的字符串,PS1定义你的主提示符是怎样构成的。一般设为PS1="[\[email protected]\h \W]\\$ "意思是:[用户名@主机名 当前目录]。

(5)PWD

你当前的工作目录的路径,它指出目前你在什么位置。

(6)SHELL

你当前使用的Shell和Shell放在什么位置。例如,查看用户登录系统时默认使用的Shell。


2)系统变量 符号#!用来指定该脚本文件的解析程序。在上面例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。可以利用下面的语句改变文件的属性为可执行属性。

在Shell中有一些变量是由系统设置好的,用户不能重新设置,见下表所示。


用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

例如:

echo $SHELL

/bin/bash

cd $HOME/bin


3)Shell用户变量 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

Shell用户变量是使用最多的变量,可以使用任何不包含空格字符的字串作为变量名称,可以用复制符号(=)给变量赋值。变量赋值时,“=”左右两边都不能有空格,BASH中的语句结尾不需要分号。

下面是变量示例:

#varname=value :赋值

#readonly varname :标记只读

#export varname :标记移出,变量可以被子进程继承


#setenv PATH=/home:/usr:/etc:/bin:/usr/bin: (csh中) 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

#varname=expr $varname + 1 :变量值增1

#x=$[ $x + 1 ]

#echo $PATH

在shell编程中,所有的变量都由字符串组成,并且不需要预先对变量进行声明。


例如 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。:

#!/bin/sh

#set variable a

a="hello world"

#print a

Echo "A is:"

echo $a


3.流程控制 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

1)条件控制

(1)test命令

测试文件、变量的属性,表达式的值,或命令执行返回值。

test –d /usr [ -d /usr ]

test –f .bashrc [ -f .bashrc ]

test $count –gt 0 [ $count –gt 0 ]


(2)if语句 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

if (expression) then

command-list

else

command-list

fi


(3) case语句 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

case $var in

pattern1) command-list ;;

pattern2) command-list ;;

esac


(4)逻辑运算符 && 和 || 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

# test –f myfile.c && echo “file found”

If test –f myfile.c then

echo “file found”

fi

# test –f myfile.c | | echo “file not found”

If test ! –f myfile.c then

echo “file not found”

fi


2) 循环控制 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

(1)for语句

for var in word-list

do

command-list

done


例如: 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

#!/bin/bash

for day in"Sun Mon Tue Wed Thu Fri Sat"

do

echo$day

done

在该例中,在for所在那行,变量day是没有加"$"符号的,而在循环体内,echo所在行变量$day是必须加上"$"符号的。


4.shell脚本的执行 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

执行shell脚本的方式基本上有下述三种。

1)设置好脚本的执行权限之后在执行脚本。可以用下面的方式设置脚本的权限:

(1)chmod u+x scriptname 只有自己可以执行,其他人不能执行。

(2)chmod ug+x scriptname 只有自己以及同一群可以执行,其他人不能执行。

(3)chmod +x scriptname 所有人不能执行。

设置好执行权限之后就可以执行脚本程序了。


例如:编辑好脚本文件 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。test1.sh。

$chmod +x test1

$ ./ test1

2)使用Bash内部命令“source”

$ source test1

3)直接使用sh命令来执行。

$ sh test1

4) 输入重定向。即用输入重定向方式让shell从给定文件中读入命令行,并进行相应处理。其一般形式:

bash< 脚本名

$sh < dircmp


8.2.3 shell 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。命令的集成

1. 元字符和文件名生成

1) UNIX元字符(通配符)的定义

* 匹配任何字符串,包括空字符串;

?匹配任何单个字符;

[.,-,!]按照范围、列表或不匹配等形式匹配指定的字符;

\转意符,使元字符失去其特殊的含义。

例如:[a-d,x,y] 匹配字符a、b、c、d、x、y;

z* 匹配以字符z开始的任何字符串;


2) 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。元字符作为文件扩展名的使用

例如:[a-f]* 匹配字符a到字符f开头的文件名,如abc,d2,e3.c,f.dat;

*z 匹配以字符z结尾的任何字符串,如win.z,core.zz,a-c-5z;

rc?.d 匹配以rc开始、以.d结束、中间为任何单个字符的文件名,如rc0.d,rc2.d,rcS.d;

*[!o] 匹配不以o结尾的文件名。


2. 管道和命令表 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

在shell中有两种结构类型:管道线和命令表。当shell检测到一个管道操作符时,就建立一个系统管道文件,这是一个先进先出的数据结构,它允许在同一时刻对管道线上的命令或程序进行读和写,即允许两个无关的命令通过管道连接交换信息。


1) 管道的概念 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

管道:一个命令的标准输出与另一个命令的标准输入之间的连接,不经过任何中间文件;

管道线:由管道操作符分隔的一个命令序列,最简单的管道线是一个简单命令;

管道操作符:用符号“|”表示。

例如:

w|wc -l

ps aux|grep ftp


2)命令表的概念 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

命令表:一串管道线构成了一个命令表,最简单的命令表是一个管道线,一个命令表送回的值是该命令表中最后一个管道线的出口状态。

管道线分隔符:分隔命令表元素,确定管道线执行的条件。各分隔符含义如下:

; 表示按顺序执行管道线;

&& 表示根据条件(true),执行其后面的管道线;

‖ 表示根据条件(false),执行其后面的管道线;

& 表示前面的管道线在后台(异步)执行。


用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。1: 四个管道线构成一个命令表

ls -l /tmp /root

w|wc -l

ps

例2: 与例1等价

ls -l /tmp /root ;w|wc -l ;ps


3 . 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。输入、输出重定向

1)使用标准改向符进行重定向(改向)

< 输入改向

<< 追加输入改向

> 输出改向

>> 追加输出改向


2)使用标准文件描述字进行重定向(改向) 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

在Linux系统中,定义了用于输入、输出的标准文件,其文件描述字0为进程的标准输入、文件描述字1为标准输出、文件描述字2为标准错误输出。

3. 标准错误输出的改向(>、>>)

格式为:

command 2 >file

command 2 >>file


例1: 将myfile1作为sort的输入。 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

sort <myfile1

例2: 将date的输出转向到myfile2文件中。

date >myfile2

例3: 将ls \|l的输出追加到myfile3文件中。

ls -l>>myfile3

例4:将错误输出改向到err-file文件。

$myprog 2>err-file

例5:将标准输出和错误输出改向out文件。

$myprog >out 2>>out

$myprog >out 2>>&1


8.3 Makefile 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

1.GNU make

1) GNU的make

使用make 工具,可以将大型的开发项目分解成为多个易于管理的模块,对于一个包含众多源文件的应用程序,使用make 和Makefile 工具就可以高效处理各个源文件之间的复杂的相互关系,进而取代了复杂的命令行操作,也大大提高了应用程序的开发效率。


2) Makefile 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。

make在执行时,需要一个命名为Makefile的文件。Makefile文件描述了整个工程的编译,连接等规则。

其中包括:工程中的哪些源文件需要编译以及如何编译;需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要得可执行文件。


大型程序维护工具如图所示。 用echo命令查看任何一个环境变量的值,也可以在命令中将环境变量的值作为参数,使用环境变量时,要在其名称前面加上“$”符号。


Makefile 或 makefile: 告诉make维护一个大型程序,该做什么。Makefile说明了组成程序的各模块间的相互关系及更新模块时必须进行的动作,make按照这些说明自动地维护这些模块。如下图所示。


在makefile(Makefile)中,自顶向下说明各模块之间的依赖关系及实现方法:

network: network.o subrs.o (1)

gcc –o network network.o subrs.o (2)

network.o: network.c netdefs.h (3)

gcc –c network.c (4)

subrs.o: subrs.c netdefs.h (5)

gcc –c subrs.c (6)

其中(3)—(6)可以简化为:(隐含的规则)

network.o subrs.o: netdefs.h

注意:命令需要以【TAB】键开始


执行: 在makefile(Makefile)中,自顶向下说明各模块之间的依赖关系及实现方法:

#make

#make network

#make –f makefile


2.makefile规则 在makefile(Makefile)中,自顶向下说明各模块之间的依赖关系及实现方法:

规则:用于说明如何生成一个或多个目标文件,规则格式如下:

targets: prerequisites

command

目标依赖命令

main.o:main.c

gcc–c main.c

目标?依赖?命令?


1)目标 在makefile(Makefile)中,自顶向下说明各模块之间的依赖关系及实现方法:

在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。

一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立

为最终的目标。


2)依赖文件 在makefile(Makefile)中,自顶向下说明各模块之间的依赖关系及实现方法:

目标文件所依赖的的文件,一个目标文件可以依赖一个或多个文件。

3)文件名

make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:

make –f文件名


4 在makefile(Makefile)中,自顶向下说明各模块之间的依赖关系及实现方法:)伪目标

Makefile中把那些没有任何依赖只有执动作的目标称为“伪目标”(phony targets)。

.PHONY:clean

clean:

rm–f hello main.o func1.o func2.o

“.PHONY”将“clean”目标声明为伪目标


5)变量 在makefile(Makefile)中,自顶向下说明各模块之间的依赖关系及实现方法:

要设定一个变量,你只要在一行的开始写下这个变量的名字,后面跟一个 = 号,后面跟你要设定的这个变量的值。以后你要引用 这个变量,写一个 $ 变量,后面是围在括号里的变量名。比如在下面:

myprog : foo.o bar.o

gcc foo.o bar.o -o myprog

foo.o : foo.c foo.h bar.h

gcc -c foo.c -o foo.o

bar.o : bar.c bar.h

gcc -c bar.c -o bar.o


利用变量重写一遍: 在makefile(Makefile)中,自顶向下说明各模块之间的依赖关系及实现方法:

OBJS = foo.o bar.o

CC = gcc

CFLAGS = -Wall -O -g

myprog : $(OBJS)

$(CC) $(OBJS) -o myprog

foo.o : foo.c foo.h bar.h

$(CC) $(CFLAGS) -c foo.c -o foo.o

bar.o : bar.c bar.h

$(CC) $(CFLAGS) -c bar.c -o bar.o


还有一些设定好的内部变量,它们根据每一个规则内容定义。三个比较有用的变量是:

[email protected], $< 和 $^ ,这些变量不需要括号括住。

[email protected] 扩展成当前规则的目标文件名。

$< 扩展成依靠列表中的第一个依靠文件。

$^ 扩展成整个依靠的列表,除掉了里面所有重复的文件名。利用这些变量,可以把上面的 makefile 写成:


OBJS = foo.o bar.o 还有一些设定好的内部变量,它们根据每一个规则内容定义。三个比较有用的变量是:

CC = gcc

CFLAGS = -Wall -O -g

myprog : $(OBJS)

$(CC) $^ -o [email protected]

foo.o : foo.c foo.h bar.h

$(CC) $(CFLAGS) -c $< -o [email protected]

bar.o : bar.c bar.h

$(CC) $(CFLAGS) -c $< -o [email protected]


Q&A 还有一些设定好的内部变量,它们根据每一个规则内容定义。三个比较有用的变量是:


ad