静态库.a:保存的函数和变量,在编译阶段加载到可执行文件中
动态库.so:保存的函数和变量,在执行阶段加载到执行文件中
使用静态库和动态库的区别(可执行文件的区别):
1.使用静态库编译出来的可执行文件的大小 >使用动态库编译出来的可执行文件大小 影响内存的开销。
2.使用静态库编译出来的可执行文件的执行速度>使用动态库编译出来的可执行文件的执行速度
3.对功能做升级的时候,动态库优于静态库。
4.使用静态库编译出来的可执行文件的部署优于动态库
库文件的存放路径:
系统运行所需要的库文件:/lib 第三方软件和工具所需要的库:/user/lib
gcc -I(i大写)指定你的头文件在哪里
gcc -L(指明库的路径:当前目录下)
gcc -l指定库名 libname.a 库名必须如此
name是自己定义的,只需要它就行lib 和.a固定中间是自己取的库名gcc -lcal(小写)
静态库的创建:gcc -c 源文件.c ----创建目标文件
使用ar工具生成静态库:
ar rcs 静态库名 目标文件1 目标文件2 -----将目标文件加入到库中
rc :静态库不穿在时,就创建该库
s:更新库文件
gcc main.c -o main -L.(指明库的路径:当前目录下) -lcal (指出自定义头文件的位置)-I./tmp
动态库的创建:
gcc -shared -fPIC -o 库名.so 源文件.c
动态库的使用:
gcc 源文件.c ./库名.so -o 可执行文件名
学习GDB的三步走:
1.学习使用gdb(基础命令)
2.掌握GDB的场景的使用技巧(多任务,网络程序,内存管理,core,汇编程序)
3.实现gdb (实现一个调试器:应用程序)
gdb命令:
run:在调试器中运行程序
list:查看程序源码
break+行号:设置断点
break+行号+if条件:设置断点
break+函数名:设置断点
delete+断点编号:删除断点
enable/disable:使能断点
print +/x 变量名:查看变量值
next:单步执行,不进入子函数
step:也是单步执行,进入子函数
continue:继续执行直到遇到下一个断点
finish:继续执行,在函数内部时,执行到函数结束
call + 函数名:调用函数
print + 变量=值: 设置变量的值
clear:清楚所有断点
ptype +变量:查看变量的类型
gdb +可执行文件 + --tui:启动图形化调试窗口
layout asm :显示汇编
layout src :显示源代码
layout split:显示源代码+汇编
工程管理器make --------如何编辑makefile文件?
什么是过程?多个源文件+其他文件(图片+头文件+脚本文件)
工程管理器的作用:编译多个源文件?------gcc+所有的源文件 -o 可执行文件-------> 可以实现自动编译
make的依赖makefile文件;
makefile文件是一种脚本文件(批处理),存在相关语法;
makefile语法:
三要素:目标,依赖,命令
格式:
目标:依赖(此处换行)
(TAB键)命令
目标:最终生成的文件。
依赖;生成目标时所需要的文件
命令:生成目标时。需要执行的命令
如实现 hello world
hello:hello.c
gcc hello.c -o hello
伪目标:
.PHONY:clean(伪目标名clean) install
clean:install(依赖) ____不会生成目标文件
rm -f hello hello.o @rm -f hello hello.o (@可以取消回显,表示终端不再显示该命令)
@echo make done!(加入该语句显示,意味执行成功)
install:
cp hello bin
make clean --------------执行rm -f hello hello.o且不生产目标文件
make hello.o
make 目标体 则从目标体处开始执行;如果make后面不跟目标体则直接执行
make的执行顺序:
make:默认从第一个目标提执行
make+目标体:从对应的目标体执行。如果目标体后面依赖的文件是一个目标的花,先执行依赖对应的目标,再执行目标体的具体命令
makefile和Makefile都可以使用:大小写makefile都存在时make 调用小写makefile
make -f Makefile调用大写Makefile文件 在makefile文件中,#代表注释,注释单独一行
有需求关系的时候,被需求的写在后面;所以终极目标写在第一行
makefile的默认内置变量
$@:表示目标文件的名称,包含扩展名
$^:表示所有的依赖文件,以空格隔开,不重复
$<:表示第一个依赖文件的名称
$+:表示所有的依赖文件,空格隔开,可以重复
$*:表示目标文件的名称,不包含扩展名
$?:依赖项中,所有比目标文件新的依赖文件
make menuconfig ----- 图形化
shell 是什么?shell是一个命令行解释器
作用是遵循一定的语法将输入的命令加以解释并传给系统
shell既是一种命令语言,又是一种程序设计语言
命令程序就是脚本程序通过shell计算机可直接运行
程序基础:
#!/bin/sh
#!用来告诉系统它后面的参数是用来执行该文件的程序
要使脚本可执行:
chmod + x filename
./filename 执行脚本
变量:
变量名=值
变量赋值时,“=”两边不可以加空格
bash中的语句结尾不需要分号
int main(int argc,char *argv[],char ** env)
*argv[] --------**argv
默认变量:
$#;传入脚本的命令行参数的个数
$*:所有命令行参数值。在各个参数值间留有空格
$0:命令本身
$1:第一个命令行参数
$2:第二个命令行参数
shell中的IF语句
例一:
if [expression]
then
#code block
fi
if [expression]
then
#code block
else
#code block
fi
例二:
if [expression]
then
#code block
else if [expression]
then
#code block
else
#code block
fi
fi
无论几重嵌套都是以两个fi结尾
比较操作 整数操作 字符串操作
相同 -eq =
不同 -ne !=
大于 -gt >
小于 -it <
大于或者等于 -ge
小于或者等于 -le
为空 -z
不为空 -n
例:
比较整数a和整数b是否相等: if[ $a = $b ]
比较整数a是否大于整数b: if[ $a -gt $b ]
比较字符串a是否大于字符串b: if[ $a = $b ]
判断字符串是否为空: if [ -z $a ]
注:在[ ] 两边都要留有空格
在‘=’两边也有空格
-e 文件已存在
-f 文件是普通文件按
-s 文件大小不为0
-d 文件是一个目录
- r文件对当前用户可以读取
- w文件对当前用户可以写入
-x 文件对当前用户可以执行
&&---------与运算 || 或运算 都是短路运算符;短路属性
FOR语句
for var in [list]
do
#coed block
done
其中var是循环控制变量。[list]是var需要变量的一个集合,do/done包含了循环体,相当于c语言的大括号,另外do 和for被卸载同一行,必须在do前面加上“;”如:for var in [list];do
while语句
while循环结构的是:
while [condition]
do
#code block
done
Unitl语句
unitil [condition]
do
#code block
done
while和until的区别在于while为真时执行,until为假时执行
case语句:
case "$var" in
contidion1);;
contidion1);;
.....
*)
default statements
esac