=============================================================
Makefile编写:
makefile文件在编译的时候可以节省编译时间,原因是它根据文件的是否更新过才编译,没有更新过的文件不进行编译。
- 目标:依赖(没有依赖时为为目标,例如clean:)
- 定义变量:变量名 = 内容
- 使用变量:$(变量名) , $@为目标 , $^为所有依赖 , $<为第一个依赖
- 函数patsubst: $(patsubst %.c, %.o, $(SRC)) 意思是将所有SRC所指的所有.c文件替换成,o文件
- 函数wildcard: $(wicard ./*.c) 意思是匹配当前目录下所有.c文件
TARGET =./bin/main
SRC =$(wildcard ./src/*.c)
OBJ =$(patsubst %.c, %.o, $(SRC))
CC =gcc
CONFIG =-I./inc -L./lib -l库名
$(TARGET):$(OBJ)
$(CC) $^ -o $@ $(CONFIG)
%.o:%.c
$(CC) $< -o $@ -c $(CONFIG)
clean:
rm $(TARGRT) $(OBJ)
- 输入make 即可编译文件,这种情况适用于工程文件源文件很多的时候。
- 工程文件一般包含src,lib,inc,bin,pic等目录
=============================================================
静态库和动态库:
为什么要将代码封装成库,后期制作的时候不希望对方知道源码,但对方可以使用封装好的函数,这时候就需要库,其次方便归档。
- 如何生成静态库:
- 1.将源文件编译成.o文件:
gcc -o model.o -c model.c
- 2.将.o文件做成静态库:格式:(lib库名.a-----例如libmodel.a ,其中model 就是库名)
ar为归档命令生成静态库,c表示如果要生成新的静态库不要警告,r代替库中现有的文件或者插入新的文件,v 输出详细信息。
ar crv libmodel.a model.o
-
3.编译程序 gcc o main main.c -L库路径 -lmodel (静态库编译的时候要 ,运行的时候不需
要) -
如何生成动态库:
-
1.把源文件编译成.o文件
gcc -fPIC -o model.o -c model.c (-fPIC生成文件与地址无关)
- 2.把.o文件打包成动态库
gcc -shared -fPIC -o libmodel.so model.o
- 3.使用动态库编译程序
gcc -o main main.c -L./ -lmodel
运行时会报错,找不到动态库路径:解决如下
1. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd) ---在当前路径下设置库环境变量(临时设置)
2. 或者将libmodel.so 复制到系统/lib目录下
=============================================================
GDB调试:
1.安装gdb调试工具:sudo apt-get install gdb
2.编译程序时加上-g :
gcc -o main main.c -g
3.调试程序:gdb main
-
基本命令:
list 行号----》l ----- 显示代码10行
r ------运行run
s ------单步运行调试(遇到函数会进入)step
n -----单步调试(不会进入被调用的函数内部)next
b 行号 ------设置断点
c ------当遇到断点停下后继续运行
p 变量 ----输出变量信息 -
设置条件断点
b 16 if i==8 在16行设置断点,并且当 i ==8的时候才断点生效 -
设置观察点 -----程序调试运行后遇到断点停下来才可以设置观测点
watch 变量名称 —设置观察点(当变量值有变动的时候就会停止)