1、文件:
src:1.c 2.c main.c
header:1.h 2.h
makefile
2.1.c:
#include <stdio.h>
int add(int a, int b)
{
printf("a=%d, b=%d\n",a,b);
return a+b;
}
2.c:
#include <stdio.h>
int sub(int a, int b)
{
printf("a=%d,b=%d\n",a,b);
return a-b;
}
main.c
#include <stdio.h>
#include "1.h"
#include "2.h"
int main(int argc, char **argv)
{
printf("argc:%d\n",argc);
for(int i=0;i<argc;i++)
printf("i:%d, %s \n",i,argv[i]);
}
3、单独编main.c:
gcc main.c -o main.out
./main.out,结果正确:
argc:1
i:0, ./main.out
4、Makefile:
main:1.o 2.o main.o
gcc 1.o 2.o main.o -o main.out
1.o:1.c 1.h
gcc -c 1.c -o 1.o
2.o:2.c 2.h
gcc -c 2.c -o 2.o
main.o:main.c
gcc -c main.c -o main.o
clean:
rm -f *.o *.out
然后 ./main.out 也可。
5.make在执行第一个目标的生成时,target的名字和下面gcc -o的名字不同,实验结果是产生了main.out,表明是以下面的命令为准。
需注意的是,生成1.o、2.o这些时,:后面可以不写某个文件,比如把.h文件拿掉,也能编过;但是这违背了Makefile的设计,:后面的英文原意是 prerequisites,即如果不写,哪天后面的文件发生了变化,这里也不会被触发重编。