文章目录
前言
本文所写代码是基于linux下的编程
一、文件
a.c
#include <stdio.h>
#include "a.h"
int main()
{
printf("hello, world!\n");
printf("A= %d\n", A);
test_fun();
return 0;
}
b.c
#include <stdio.h>
#include "a.h"
int test_fun()
{
printf("it is B\n");
return 0;
}
a.h
#define A 1
int test_fun();
二、makefile的升级
上一个引入的makefile还是有缺点的,需要进行修改:
makefile
objs := a.o b.o
test:$(objs)
gcc -o test $^
# .a.o.d .b.o.d
dep_files := $(foreach f,$(objs),.$(f).d)
dep_files := $(wildcard $(dep_files))
ifneq ($(dep_files),)
include $(dep_files)
endif
%.o : %.c
gcc -Wp,-MD,.$@.d -c -o $@ $<
clean:
rm *.o test
% : 通配符,表示所有的.o文件都依赖于.c文件
#: 注释
$@ :表示当前的目标 也就是%.o
$< : 表示当前的第一个依赖.也就是%.c
$^ : 表示所有的依赖
objs是一个变量
$(objs)取这个变量的值
foreach:是一个函数,这个函数主要的作用是字符串替换和修改,foreach f,$(objs)
,会把变量objs里的值给到f, .$(f).d
是要修改的格式,也就是在f的前面加多一个 ‘.’ 后面加 ‘.d’ ,$(foreach f,$(objs),.$(f).d)
最后得到的结果就是.a.o.d .b.o.d
,最后把这个值赋给dep_files ;
wildcard: 是一个函数,$(wildcard $(dep_files))
最终得到的是字符串,得到后面
$(dep_files)文件中的字符串,也就是.a.o.d .b.o.d
中的内容,然后再赋值给dep_files这个变量。
ifneq ($(dep_files),)
include $(dep_files)
endif
如果存在 dep_files,就把变量dep_files的值包含进来,也就是.a.o.d .b.o.d
两个文件的内容加进来。
-Wp,-MD,.$@.d
: 表示生成%.c所有依赖,存放在.$@.d
文件中,也就是生成.a.o.d .b.o.d
文件。
clean:
rm *.o test
执行make clean 就会调用rm *.o test
这个命令。
.a.o.d:
a.o: a.c /usr/include/stdc-predef.h /usr/include/stdio.h \
/usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
/usr/include/x86_64-linux-gnu/bits/wordsize.h \
/usr/include/x86_64-linux-gnu/gnu/stubs.h \
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h \
/usr/include/x86_64-linux-gnu/bits/types.h \
/usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h \
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h a.h
.b.o.d:
b.o: b.c /usr/include/stdc-predef.h /usr/include/stdio.h \
/usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
/usr/include/x86_64-linux-gnu/bits/wordsize.h \
/usr/include/x86_64-linux-gnu/gnu/stubs.h \
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h \
/usr/include/x86_64-linux-gnu/bits/types.h \
/usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/libio.h \
/usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h \
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h a.h