Linux 编程环境
1.编辑器 vi
(1)编辑器 vi 简介
编辑器 vi 最初是由 Sun Microsystrms 公司的 Bill Joy 在1976 年开发的。启初,开发出了 Ex 编辑器,也称为行编辑器,后来开发了vi作为Ex的可视接口,一次能看到一屏的文本而不仅仅是一行,vi因此得名。vi在通过命令操作,界面不友好,对普通人不容易掌握。但是,其丰富的命令和强大的功能,以及占用资源少的特性,使得它在嵌入式Linux系统中,广泛使用。
(2)vi用法
vi有三种模式:
插入模式: 写代码
可视模式: 复制、粘贴、删除、查找等
2.编译器 gcc
(1)编译器 gcc 简介
Linux系统下的 gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,它是GNU的代表作品之一,gcc是可以在多种硬件平台上编译出可执行文件的超级编译器,其执行效率比一般的编译器要高出20%-30%。编译器能将C、C++语言源程序、汇编语言源程序和目标程序编译、链接成可执行文件如果没有给出可执行文件的名字,gcc将生成一个默认名为a.out的可执行文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件,而gcc则通过后缀来区别输入文件的类型。
自己查找:
GNU :是一个自由软件工程项目,对unix向上兼容的完整的自由软件系统
GPL (General Public License):是GNU的通用公共许可证,同其它的自由软件许可证一样,许多社会公众享有:运行、复制软件的自由,发现传播软件的自由,获得软件原码的自由。
GPIO:微控制芯片上的一个通用可编程io接口
(2)gcc 的编译过程
源文件(.c .h)-> 预处理->编译->汇编->(静态库,动态库)链接->可执行文件
预处理(Preprocessing):
主要处理源文件中,以'#'开头的语句,如#include #ifdef #define等,该阶段会产生一个中间文件 (*.i)。
命令 gcc -E -o zmx.i zmx.c。(通常是程序警告)
编译阶段(Compilation):
预处理完成后,gcc首先检查代码的规范性,以及是否有语法错误等。检查无误后,开始把代码翻译成汇编语言。
命令:gcc -S -o zmx.s zmx.c
汇编阶段(Assembly):
在汇编阶段,将输入的汇编文件 *.s,转换成目标文件 *.o, *.o 已经是二进制文件,即 0 和 1的机器语言,但是,它不是可执行的二进制文件。
命令:gcc -c -o zmx.o zmx.c
链接阶段(Linking):-o
汇编之后,进入链接。在链接阶段,通过链接各种静态库和动态库,得到可执行文件。
命令:gcc -o star zmx.c
(3)gcc 常见的用法
gcc -c
gcc -E
gcc -S
gcc -o 生成指定的输出文件
gcc -v 查询gcc版本信息
gcc -g 生成调试信息,gdb调试器可以利用该信息
gcc -I 指定额外的头文件搜索路径
gcc -L 指定额外的函数库搜索路径
gcc -static 静态链接库,默认都是动态链接库
gcc -w 不生成任何警告信息
gcc -Wall 生成所有警告信息
gcc -c zmx.c -o zmx
gcc -o zmx zmx.c
gcc zmx.c -g -o zzz
---------------------------------------------------------------------------
模块化编程:
例子:写一个四不像软件。
1.写一个判断月份的程序2.写一个比较两个数大小的程序
3.写一个随机数的程序
4.写一个hello world程序
架构:
将每个模块写一个.c文件,文件不存在main(),将函数的声明写在.h文件里。
写一个main程序,包含各模块的功能。
----------------------------------------------------
例如:第1步:编写 month.c
#include <stdio.h>
void month()
{
//业务逻辑代码
}
第2步:编写 month.h
void month();
第3步:编写 compare.c
#include <stdio.h>
void compare()
{
//业务逻辑代码
}
第4步:编写 compare.h
void compare();
第5步:编写 syso.c
#include <stdio.h>
void syso()
{
//业务逻辑代码
}
第6步:编写 syso.h
void syso();
第7步:编写 main.c
#include <stdio.h>
#include "month.h"
#include "compare.h"
#include "syso.h"
void main()
{
printf("开始演示本程序!\n");
month();
compare();
syso();
}
第8步:编写makefile
second: main.o compare.o syso.o month.o
gcc -o second main.o month.o compare.o syso.o
main.o: main.c
gcc -c -o main.o main.c
compare.o:compare.c
gcc -c -o compare.o compare.c
syso.o: syso.c
gcc -c -o syso.o syso.c
month.o: month.c
gcc -c -o month.o month.c
clean:
rm -rf *.o second
第9步:输入"make"命令,创建可执行程序 second
第10步:输入"./second"执行程序
(也可以不写Makefile,直接将每个模块的.c文件生成.o文件,然后将.o和.h文件与main.c文件整合.再用gcc -o second main.o month.o compare.o syso.o 生成了 可执行文件second,再./second执行即可。这种多次修改就比较繁琐!)
3.调试器 gdb
使用gdb: 1.生成gdb调试信息文件(gcc 源文件 -g -o 新文件名)
2.直接进入:gdb 文件名 或者:gdb --->file 文件名
(1)调试器 gdb 简介
gdb是Linux系统上缺省(可装可不装的)使用的调试器。gdb也可以被移植到不同的平台上,如ARM系列处理器的调试器
(2)gdb 用法
1.进入gdb调试环境,有两种方式。
(1)在shell终端,直接输入 gdb ,会看到gdb的一些版本信息;然后使用file 命令调试可执行程序。 file star (star 为需要调试的可执行程序)
(2)在终端直接输入 gdb star.
gdb 文件名
2.gdb 的常用命令:
命令 简写 格式 含义
(C)file file 文件名 加载文件
display display 变量名 显示参数(设置监听变量)
(D)run r run args 运行程序
list l list [开始,结束] 列出文件的代码清单
print p print 变量名 打印变量的内容
break b break [行号或函数名] 设置断点
continue c continue [开始,结束] 继续运行
info i info 变量名 列出信息
next n next 下一行
step S step 进入函数(步入)
r----》s单步
quit q 退出
delete 删除断点 (断点参数是第几个,加数字)
disable 禁用断点
enable 恢复禁用的断点
4.make 和 Makefile
(1)make 和 Makefile 概述
make 是一个命令,用来解析Makefile文件;
Makefile 是一个文件,用来告诉 make 命令如何编译整个工程,生成可执行文件。
(2)make 命令
make [选项] [Makefile 文件]
make 执行的流程:
1. 查找当前目录下的 Makefile 文件;
2. 初始化 Makefile 文件中的变量;
3. 分析 Makefile 中的所有规则;
4. 为所有的文件创建依赖关系;
5. 根据依赖关系,决定哪些目标文件要重新生成;
6. 执行生成命令。
(3)Makefile 文件内容
1. 规则
(1)Makefile 是由规则来实现的: 目标 依赖 命令
(2)Makefile 的格式:
目标: 依赖
<Tab> 命令
目标和依赖之间,通过“:”分隔,命令前面,是由“Tab”键产生的空格。
当 make 命令去执行 Makefile 文件时,其规则被这样处理:
·目标是文件,依赖也是文件。若依赖文件的时间,比目标文件的时间新,说明依赖文件被更新了。则运行规则包含的命令,产生新的目标文件。
·如果依赖的是另一条规则的目标,则先跳到另一条规则去执行命令,再返回当前规则。
·如果目标不是一个存在的文件,则一定执行。(目标不存在,必须执行)
2. 变量
(1)变量的基础
(2)变量中的变量
(3)变量的高级用法
(4)追加变量值
(5)环境变量
(6)特殊(内部)变量
5.Linux 编程库
在后面课程补充(驱动部分)
6.shell 脚本编程
(1)建立和运行shell脚本
(2)shell 中的变量
1.用户自定义变量
2.位置变量
3.环境变量
(3)shell 中的test命令
1.字符串比较
2.数值比较
3.文件比较
(4)shell中的流程控制语句
1.条件语句(if)
2.循环语句(for 、while 、 unit)
(5)shell 程序中的函数
1.函数定义格式
2.函数调用格式