三个源文件:main.c sum.c show.c
/* main.c */ extern int sum(int m, int n); extern void show(int data); int main(void) { show(sum(3, 5)); return 0; } /* sum.c */ int sum(int m, int n) { return m+n; } /* show.c */ #include <stdio.h> void show(int data) { printf("%d ", data); }
Makefile大体上有两种写法:
(第一种)
#Makefile objs=main.o sum.o show.o main:$(objs) gcc $^ -o $@ main.o:main.c gcc -c $< sum.o:sum.c gcc -c $< show.o:show.c gcc -c $< clean: rm -rf *.o .*.sw?
(第二种)
/* Makefile */ objs=main.o sum.o show.o main:$(objs) gcc $^ -o $@ clean: rm -rf *.o .*.sw?
下面列举以上两种的编译过程:
(第一种)
cc -c -o main.o main.c
cc -c -o sum.o sum.c
cc -c -o show.o show.c
gcc main.o sum.o show.o -o main
(第二种)
gcc -c main.c
gcc -c sum.c
gcc -c show.c
gcc main.o sum.o show.o -o main
以上两种Makefile写法都能正确编译和输出,此时很容易看出区别,虽然第二种看起来省略很多,但是各有利弊,下面介绍异同:
1、写的makefile的时候我们是可以省略生成.o文件那一步,直接由C文件生成的(源文件比较少时OK);
2、编译的时候,目录里面没有main.o sum.o show.o这个文件,但是硬要强制去编译这个的话,系统就会用cc自动先把相关的.c文件转化成相关的.o文件;
3、第二种(简单的)方法可以用(但是建议不要这么用),如果编译的文件比较多,而且彼此之间交叉的多的时候,容易出问题,如果出了问题,处理的时候就不容易查找问题 ;
4、要是找别人给你调试Makefile的时候,别人会看不懂。