- 序言
相信接触过Linux-c的伙伴们都清楚,我们在运行代码时不像其他语言一样拥有专有ide,运行点个三角图标就完事了,而linux-c就没有那么轻松了,可以说所有事都得自己亲历亲为,敲好了代码,你得先用gcc命令去编译它,然后运行编译后的文件才算完成代码运行效果展示。
而平时敲些小文件,搞些小测试用gcc命令去编译还能接受,没那么麻烦,毕竟敲多熟练了,而一到项目中,如果你每个文件都自己编译敲一遍,再各种指定库路径,编译路径,.c文件路径,毫不夸张的说可以写篇文章了吧,哈哈,我前面写了个小项目,就用的gcc,那个编译命令写了四行长度,后面干脆把它扔到一个脚本中去,才好了很多,而脚本毕竟不是长久之计,可重用性太差。
所以makefile 来了,只要往你的代码根目录创建个makefile 文件,然后写入些命令(吐槽:不错还是得亲力亲为…),直接make 就把繁杂的编译完成了。 - 代码模板
#TOOLCHAIN = arm-linux-gcc #arm开发板使用时打开
ifdef TOOLCHAIN #选择gcc还是arm-linux-gccc
CC = $(TOOLCHAIN)
else
CC = gcc
endif
ifeq ($(CC),gcc) #根据不同的平台,选择不同的链接库
CFLAGS = -I./include -L./lib -lmm -lgcc -lc
else
CFLAGS = -I./include -L./lib -lmm #mm为库名
endif
SRC = $(wildcard ./src/*.c ./lib/*.c) #寻找所有.c文件
ELF = ./bin/main #指定可执行文件路径
OBJ = $(patsubst %.c, %.o, $(SRC)) #把.c 换成.o
$(ELF):$(OBJ) #^:所有依赖-->OBJ ,@:生成目标放置地方,把.o放到ELF中,CFLAGS:选择库
$(CC) $(OBJ) -o $@ $(CFLAGS)
%.o:%.c #^:由.o生成.c,CFLAGS:选择库
$(CC) $< -o $@ -c $(CFLAGS)
clean: #清除可执行文件,重新编译
$(RM) $(ELF) $(OBJ)
.PHONY: clean
//后添加版本 2020.9.1
SRC = $(wildcard *.c) #找到当前路径下面所有的.c结尾的文件名
OBJ = $(SRC:%.c=%.o) #将SRC这个变量当中的.c尾缀变化为.o尾缀
image = out
CC = gcc
# COMP_FLAG = -L ../lib -ljpeg -lfreetype
$(image):$(OBJ)
$(CC) $^ -o $@ $(COMP_FLAG)
$(OBJ):%.o:%.c
$(CC) $^ -o $@ -c -I ../include
clean:
@rm $(OBJ) image -rf
.PHONY:all clean
#@符号的意思代表这个命令的执行语句不要打印出来
而我的文件目录是这样的:
- 模板搬运需要改变的地方
- 每个人的开发目录都不一样,而只要把下面这个路径改一下就能通用
SRC = $(wildcard ./src/*.c ./lib/*.c) #寻找所有.c文件
比如你的.c文件放在一个hello文件中,那么只需改成下面这样就行了
SRC = $(wildcard ./hello/*.c)
注意:hello和makefile是同层目录! - 在开发板上运行时,需要把第一行的代码的#号去掉
TOOLCHAIN = arm-linux-gcc
- 而你的项目没有依赖库的话,需要把
CFLAGS = -I./include -L./lib -lmm -lgcc -lc
改成下面这样
CFLAGS = -I./include
我的include文件夹放的是头文件lib.h
,项目依赖于这个头文件,所以我放进去了,如果大家没有依赖的头文件或者库需要把所有的CFLAGS
删掉。
需要注意的地方就这几个,改动好后我们就能一键make编译了,是不是瞬间轻松了许多。
- 下面是我make编译过程:
- make 后的目录:
到此讲解就结束了,个人觉得纯小白理解还是有些难的,建议先去看下makefile 的知识再来看会简单很多,我是花了差不多一天的时间看了makefile 的语法,然后查看了别人的案例,结合书本知识,最后写了这个相对通用的版本,以后就是直接拿过去改变一下就能用了,不用再写了。