LinuxC高级_day5
【1】shell函数
1. 函数的定义方式
1)函数名()
{
命令
}
2)function 函数名()
{
}
注意 : 1. function是函数的声明
2. shell函数没有参数列表 参数列表是在调用函数的时候使用位置变量
3. 大括号包裹起来 成对出现
4. 函数内部可以有return语句 但是声明没有返回值
5. 函数内部变量默认是全局变量 如果想要声明局部变量要使用local
- 函数的调用方式
函数名
函数名 参数1 参数2
变量=`函数名`
- 1)函数中有return的时候 可以使用$?打印函数的返回值
FUN()
{
let num=1+2
return $num
}
FUN
echo $?
2)函数中没有return 调用函数之后可以直接打印函数中的变量
FUN1()
{
local n=2 #local表示局部变量 $n的时候不输出
let num=1+2
}
FUN1
echo $n
echo $num
3)给函数传参 参数在函数中用$1 $2来接收
FUN2()
{
expr $1 + $2
echo "hello"
}
FUN2 3 4
4)函数结果给一个变量 把变量打印出来
FUN3()
{
expr $1 + $2
echo "hello"
}
var=`FUN3 5 6` #将函数输出到终端上的所有结果以字符串的形式返还给变量
echo $var
【2】gdb使用
1)gcc编译
gcc -v
//查看编译器的版本号
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
- gcc编译出来的代码能不能在安卓手机上执行? – 不能
架构不同 32位Ubuntu X86 安卓手机arm架构
2)gcc编译四步
1. 预处理
处理与#相关的代码
gcc -E xxx.c -o xxx.i
2. 编译
生成汇编文件 检查代码规范性和语法错误
gcc -S xxx.i -o xxx.s
3. 汇编
将汇编语言编程不可执行的二进制文件(机器语言)
gcc -c xxx.s -o xxx.o
4. 链接
将不可执行变成可执行的二进制文件
gcc xxx.o -o xxx
3)调试方式
1.log文件
2.gdb (* xxgdb)
gcc -g test.c
gdb a.out
l 查看文件
b 行号 / b 函数名 设置断点
info b 查看断点的情况
d num(断点编号) 删除断点
p 变量名 打印变量的值
s/n 单步运行
r 运行代码
help 帮助文档
q 退出
修正履历: 谁 什么时候 动了什么
新规 /***************** 函数:
fun1 参数: @1 int a
. . . . . . . . . . @2 char *b
返回值: int
作者: 日期
******************/
【3】Makefile
-
make
工程管理器 管理较多的文件 读入文件的时间戳
Makefile
是make
读入的唯一指定文件 -
格式
标签:
<TAB> 命令
目标:依赖文件
<TAB> 命令
make: `test' is up to date 文件是最新的
[练习]Makefile编写gcc编译四步
- makefile变量
1)自定义变量
1.=
递归方式展开
var1=abc
var2=$(var1)
var1=def
all:
echo $(var1) #def
echo $(var2) #def
:=
直接赋值
var1:=abc
var2:=$(var1)
var1:=def
all:
echo $(var1) #def
echo $(var2) #abc
?=
询问赋值 如果被赋值的话就不再赋值了
var1=hello
var1?=world
all:
echo $(var1) #hello
+=
追加赋值
var1:=abc
var2:=def
var2+=$(var1)
all:
echo $(var1) #abc
echo $(var2) #def abc
2)预定义变量
CC
C编译器的名称
CFLAGS
C编译器的选项
3)自动变量
$<
第一个依赖文件的名称
$@
目标文件的完整名称
$^
所有不重复的依赖文件名称 以空格分开
eg: 有main.c文件和add.c文件
1.基础的目标文件和依赖文件的关系写出makefile
add:add.o main.o
gcc add.o main.o -o add
add.o:add.c
gcc -c add.c -o add.o
main.o:main.c
gcc -c main.c -o main.o
- 使用变量替换
OBJS=add.o main.o
CC=gcc
CFLAGS=-c
add:$(OBJS)
$(CC) $(OBJS) -o add
add.o:add.c
$(CC) $(CFLAGS) add.c -o add.o
main.o:main.c
$(CC) $(CFLAGS) main.c -o main.o
- 使用自动变量
OBJS=add.o main.o
CC=gcc
CFLAGS=-c
add:$(OBJS)
$(CC) $(OBJS) -o $@
$(OBJS):%.o:%.c
$(CC) $(CFLAGS) $^ -o $@
【注】$(OBJS):%.o:%.c
指明了我们的目标文件从$(OBJS)
中获取
%.o
表明所有以.o结尾的目标文件也就是main.o
和add.o
也就是
$(OBJS)
这个集合模式 它依赖模式%.c
也就是main.c
和add.c
make
参数
make -n
只打印命令 但是不执行
make -s
执行的时候不显示命令
[练习]sub.c add.c main.c写Makefile