Makefile的几个简单示例

word下载:点击打开链接

 

一、只有一个.c文件时的Makefile书写

 

 

main.c

 

#include <stdio.h>

int main(void)
{
    printf("Makefile\n");
    return 0;
}


 

Makefile

CFLAGS=-Wall
CC=gcc

main:main.o
	$(CC) $(CFLAGS) main.o -o main
main.o:main.c
	$(CC) $(CFLAGS) -c main.c -o main.o
clean:
	$(RM) main.o
	$(RM) main
.PHONY:clean

 

 

Makefile的第二种写法:

CFLAGS=-Wall
CC=gcc

main:main.o
clean:
	$(RM) main.o
	$(RM) main
.PHONY:clean

 

 

 

 

二、有两个.c文件时,Makefile的书写

 

main.c

#include <stdio.h>

extern void fun1(void);
extern void fun2(void);

int main(void)
{
    printf("main\n");
    fun1(); 
    fun2();
    return 0;
}

fun 1.c

#include <stdio.h>

void fun1(void)
{
    printf("fun1\n");
}

fun2.c
#include <stdio.h>

void fun2(void)
{
    printf("fun2\n");
}


 

Makefile

CFLAGS=-Wall
CC=gcc

main:main.o fun1.o cs2/fun2.o
clean:
	$(RM) *.o
	$(RM) cs2/*.o
	$(RM) main
.PHONY:clean

 



 

Makefile的另一种写法:

CFLAGS=-Wall
CC=gcc

main:main.o fun1.o cs2/fun2.o
	$(CC) $(CFLAGS) $^ -o $@
main.o:main.c
	$(CC) $(CFLAGS) -c $^ -o $@
fun1.o:fun1.c
	$(CC) $(CFLAGS) -c $^ -o $@
cs2/fun2.o:cs2/fun2.c
	$(CC) $(CFLAGS) -c $^ -o $@
clean:
	$(RM) *.o
	$(RM) cs2/*.o
	$(RM) main
.PHONY:clean


 

三、嵌套Makefile的书写

其中makefiletest目录下的Makefile为总控Makefile,通过make命令读取总控Makefile,然后总控Makefile在依次读取子目录下的Makefile

总控Makefile

CC=gcc
CFLAGS=-Wall -g 

SUBDIR=d1 \
	   d2 \
	   d3 \
	   d4 \
	   main \
	   obj

OBJS=d1.o d2.o d3.o d4.o main.o
BIN=myapp

OBJDIR=obj
BINDIR=bin

export CFLAGS CC SUBDIR OBJS OBJDIR BIN BINDIR

all:checkdir $(SUBDIR) 
checkdir:
	mkdir -p $(BINDIR)

//注意:$(SUBDIR)后面应该有依赖文件,否则make -C $@没法执行,或者将目录名全部声明为伪目标
$(SUBDIR):huixian
	make -C $@  

##是$@,而不能是$(SUBDIR)
huixian:
	@echo $(SUBDIR)
	@echo begin!
clean:
	@$(RM) $(OBJDIR)/*.o
	@rm -rf $(BINDIR)
.PHONY:clean

注意:Makefile的注释必须以##开头,并且需顶头写。

 

main/main.c

#include "../d4/d4.h" 
extern void fun2(void);
extern void fun3(void);
extern void fun1(void);
int main(void)
{
    fun1();
    fun2();
    fun3();
	fun4();

    return 0;
}


 

main/Makefile

../$(OBJDIR)/main.o:main.c
	$(CC) -c $(CFLAGS) $< -o $@


 

include/myinclude.h

#ifndef __MYINCLUDE_H__
#define __MYINCLUDE_H__

#include <stdio.h>

#endif


 

d1/d1.c

#include "../include/myinclude.h"

void fun1(void)
{
    printf("fun1\n");
    return ;
}

d1/Makefile

../$(OBJDIR)/d1.o:d1.c
	$(CC) $(CFLAGS) -c $< -o $@



 

d2/d2.c

#include "../include/myinclude.h"

void fun2(void)
{
    printf("%s\n","this is fun2");
}

d2/Makefile

../$(OBJDIR)/d2.o:d2.c
	$(CC) $(CFLAGS) -c $^ -o $@


d3/d3.c

#include "../include/myinclude.h"

void fun3(void)
{
    printf("%s\n","this is fun3");
}

d3/Makefile

../$(OBJDIR)/d3.o:d3.c
	$(CC) $(CFLAGS) -c $^ -o $@


d4/d4.h

#ifndef __D4_H__
#define __D4_H__

#define N 4

extern void fun4(void);

#endif

d4/d4.c

#include "../include/myinclude.h"
#include "d4.h"

void fun4(void)
{
	printf("this is fun4-->%d\n",N);
}

d4/Makefile

../$(OBJDIR)/d4.o:d4.c
	$(CC) $(CFLAGS) -c $< -o $@


make


进入bin/运行myapp



make以后目录的变化



 

make clean 以后目录的变化

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值