
全局变量使用:
1.在源文件中定义全局变量;
2.如果只是在定义该全局变量的文件中使用该全局变量,可以不声明;
3.如果要在一个外部的源文件中使用该全局变量,则该变量必须被声明;
4.在对应的头文件中加extern关键字声明,头文件中全局变量只能声明不能初始化,定义应在.c文件
在头文件的声明里,函数默认为extern,编译器会自动加上。

预处理阶段(只认
#include):
预处理器看到#include "ji.h",把ji.h里的int get_ji(int num1, int num2);复制过来。看到#include "shang.h",把shang.h里的声明复制过来。
此时,main.c里只有“声明”(知道有这两个函数),但没有“定义”(不知道这两个函数具体怎么算)。编译 + 链接阶段(关键区别):
如果只输入gcc main.c,编译器会报错:undefined reference to 'get_ji'和undefined reference to 'get_shang'。因为编译器只编译了main.c,找不到get_ji和get_shang的具体代码(定义)。头文件只是“承诺”这些函数存在,但真正的“兑现”需要靠链接器把对应的.c文件编译结果合并进来。
Makefile:管理代码工程的编译和链接,由make工具进行解释,实现一键化工程的编译和链接。
文件:Makefile/makefile(文件/脚本)
语法:
目标文件:依赖文件
编译规则
目标文件:a.out
依赖文件(生成目标文件所依赖的源文件):main.c sum.c sub.c ......
编译规则:gcc main.c sub.c sum.c ( -o a.out)
编译代码:make(默认只匹配makefile中的第一个参数)
a: 01_a gcc 01_a -o a -lpthread b: 01_b gcc 01_b -o b clean: rm a b make a匹配到a则执行 gcc 01_a -o a -lpthread make b匹配到b则执行 gcc 01_b -o b -lpthread make clean匹配到clean则执行 rm a b
Makefile中的变量:
1.自定义变量
OBJ = a.out //定义Makefile的变量OBJ,并为其赋值 SRC = main.c sum.c sub.c == SRC += main.c SRC += sum.c SRC += sub.c CC = gcc INCLUDE = ../include //include"xxx"双引号里的内容只能在当前路径下访问,所以使用-I指明头文件路径 LIBS = ../lib $(OBJ) :$(SRC) //变量的引用:$() $(CC) $(SRC) -o$@ -I$(INCLUDE) -L$(LIBS) -lm //-o $(OBJ) 给自定义变量起名 //-I头文件路径 -L指定库的位置 //-lm链接数学库 == a.out: main.c sum.c sub.c gcc main.c sub.c sum.c 自定义伪代码: clean: rm $(OBJ) //表示clean实现移除文件功能 //用 make clean调用=:给变量赋值
+=:在原变量值的基础上再增加新增
?=: 若变量之前没有被赋值则赋值,若之前被赋过值则保留原值
注意:只改头文件的话make并不会检测到头文件的修改,所以修改头文件后,需clean重新生成可执行文件,而若没在头文件中声明函数,则有时可能发生段错误。
再例如:
target = led
objs = start.o main.o
$(target).bin : $(objs)
arm-linux-gnueabihf-ld -Timx6ull.lds $(objs) -o $(target).elf
arm-linux-gnueabihf-objcopy -O binary -S -g $(target).elf $(target).bin
arm-linux-gnueabihf-objdump -D $(target).elf > $(target).dis
%.o : %.S
arm-linux-gnueabihf-gcc -g -c $^ -o $@
%.o : %.c
arm-linux-gnueabihf-gcc -g -c $^ -o $@
clean:
rm $(objs) $(target).elf $(target).bin $(target).dis
整个流程其实是 “依赖倒推 + 模式匹配”,分三步:
第一步:看最终目标需要什么
$(target).bin : $(objs)这行告诉 make:“要生成
led.bin,必须先有start.o和main.o。”第二步:发现
.o文件不存在,去寻找生成它们的规则make 开始检查
start.o和main.o:
如果它们不存在,或者比对应的
.c/.S文件旧,make 就要想办法生成它们。此时 make 在 Makefile 里搜索所有“目标能匹配
%.o”的规则,找到了:%.o : %.S %.o : %.c第三步:自动匹配并执行编译
start.o匹配到%.o : %.S规则(因为磁盘上有start.S),于是自动执行:arm-linux-gnueabihf-gcc -g -c start.S -o start.o
main.o匹配到%.o : %.c规则(因为磁盘上有main.c),于是自动执行:arm-linux-gnueabihf-gcc -g -c main.c -o main.o
$^代表“所有依赖文件”(即%.S或%.c),$@代表“目标文件”(即.o)。所以这条命令是通用的,能自动套用到任何.c或.S文件上。
敲下 make ↓ make 想生成 led.bin ↓ 需要 start.o 和 main.o ↓ start.o 不存在 → 查规则 → 匹配 %.o : %.S → 编译 start.S ↓ main.o 不存在 → 查规则 → 匹配 %.o : %.c → 编译 main.c ↓ 两个 .o 都齐了 → 执行链接 → 生成 led.elf ↓ objcopy 转成 led.bin ↓ objdump 生成反汇编 led.dis
2.系统变量
可直接使用:
$@:表示目标文件
$^ :表示所有依赖文件
$<:表示第一个依赖文件
3.
tar -cvf 文件夹.tar 文件夹
压缩文件夹
386



被折叠的 条评论
为什么被折叠?



