makefile 初步1

将两个独立的C文件编译在一起


源程序:

chunli@ubuntu:~/makefile$ cat main.c 
#include <stdio.h>
int max(int a,int b);
int main()
{
	printf("max = %d\n",max(10,20));
	return 0;
}



chunli@ubuntu:~/makefile$ cat a.c 
int max(int a,int b)
{
	if(a>b)
		return a;
	else
		return b;
}


方法1,

只编译不链接,

chunli@ubuntu:~/makefile$ gcc -o a.o -c a.c 
chunli@ubuntu:~/makefile$ gcc -o main.o -c main.c 
chunli@ubuntu:~/makefile$ gcc -o app a.o main.o 
chunli@ubuntu:~/makefile$ ./app 
max = 20




方法2,使用makefile

只认这两种makefile,Makefile

或者make -f makefiel的文件名 

makefile必须tab键

chunli@ubuntu:~/makefile$ vim makefile 
start:
	gcc -o a.o -c a.c 
	gcc -o main.o -c main.c
	gcc -o app a.o main.o


方法3,稍微复杂的

chunli@ubuntu:~/makefile$ cat makefile 
start:main.o a.o
	gcc -o app a.o main.o 
main.o a.o:
	gcc -o main.o -c main.c
	gcc -o a.o -c a.c

执行make,并运行

解析:

当执行start的时候,会检查文件 main.o a.o 是否存在,如果不存在就去找 main.o a.o并执行

chunli@ubuntu:~/makefile$ make
gcc -o app a.o main.o 
chunli@ubuntu:~/makefile$ ./app 
max = 20




方法4,make 标号

chunli@ubuntu:~/makefile$ cat makefile 
start:main.o a.o
        gcc -o app a.o main.o 
        @echo "-------------OK---------"
main.o a.o:
        gcc -o main.o -c main.c
        gcc -o a.o -c a.c
clean:
        rm -rf *.o
        rm -rf app


@就是不显示这条语句


使用:

chunli@ubuntu:~/makefile$ make clean
rm -rf *.o
rm -rf app
chunli@ubuntu:~/makefile$ make
gcc -o main.o -c main.c
gcc -o a.o -c a.c
gcc -o app a.o main.o 
-------------OK---------
chunli@ubuntu:~/makefile$ ./app 
max = 20
Hello World!




方法5 makefile的变量

chunli@ubuntu:~/makefile$ cat makefile 
#定义变量CC = gcc
CC = gcc

start:main.o a.o
	$(CC) -o app a.o main.o 
	@echo "-------------OK---------"
main.o a.o:
	$(CC) -o main.o -c main.c
	$(CC) -o a.o -c a.c
clean:
	rm -rf *.o
	rm -rf app



makefile的变量2,文件名,编译,链接,全用变量来代替


main.c源文件


int main()
{
	printf("Hello World! \n");
	return 0;
}


makefile文件

chunli@ubuntu:~/makefile$ cat makefile 
#CC = gcc
CC = g++

EXEC=app
SRCS=main.c
OBJS=main.o
FLAGS1=-o
FLAGS2=-c

start:$(OBJS)
	$(CC) $(FLAGS1) $(EXEC) $(OBJS)
	@echo "-------------OK---------"
$(OBJS):
	$(CC)  $(FLAGS1) $(OBJS) $(FLAGS2) $(SRCS)
clean:
	rm -rf $(OBJS)
	rm -rf $(EXEC)
	
	



makefile高级应用1

在makefile文件中加入多个原文件,只需要修改一处就可以了


项目文件:

chunli@ubuntu:~/makefile$ ls -1
a.c
b.c
main.c
makefile



源文件:

chunli@ubuntu:~/makefile$ cat a.c 
int max(int a,int b)
{
	if(a>b)
		return a;
	else
		return b;
}


chunli@ubuntu:~/makefile$ cat b.c 
int  add(int a,int b)
{
	return a + b;
}



chunli@ubuntu:~/makefile$ cat main.c 
#include <stdio.h>
int max(int a,int b);
int add(int a,int b);
int main()
{
	printf("max = %d\n",max(10,20));
	printf("max = %d\n",add(10,20));
	printf("Hello World! \n");
	return 0;
}




chunli@ubuntu:~/makefile$ cat makefile 
.SUFFIXES:.c .o
CC=gcc
EXEC=app
SRCS=main.c\
	a.c\
	b.c

OBJS=$(SRCS:.c=.o)	#跟随SRCS的文件名前缀,相当于字符串替换
FLAGS1=-o
FLAGS2=-c

start:$(OBJS)
	$(CC) $(FLAGS1) $(EXEC) $(OBJS)
	@echo "-------------OK---------"

.c.o:
	$(CC) $(FLAGS1) $@ $(FLAGS2) $<

clean:
	rm -rf $(OBJS)
	rm -rf $(EXEC)



编译并运行:

chunli@ubuntu:~/makefile$ make
gcc -o main.o -c main.c
gcc -o a.o -c a.c
gcc -o b.o -c b.c
gcc -o app main.o a.o b.o	
-------------OK---------
chunli@ubuntu:~/makefile$ ./app 
max = 20
max = 30
Hello World!