码迷,mamicode.com
首页 > 其他好文 > 详细

Makefile 快速入门

时间:2021-01-25 11:27:33      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:int   扩展   源文件   命令行   初步   后缀   自动   编译链接   内容   

makefile

示例

准备文件如下:
fun1.c

#include<stdio.h>
void fun1() 
{
    printf("fun1");
}

fun2.c

#include<stdio.h>
void fun1() 
{
    printf("fun1");
}

main.c

int main() 
{
    fun1();
    fun2();
    return 0;
}

目标:将这3个C文件编译,链接成一个可执行文件

命令行的编译方法

首先,分别将C文件编译成中间文件
gcc -c fun1.c -o fun1.o
gcc -c fun2.c -o fun2.o
gcc -c main.c -o main.o

然后将中间文件进行链接
gcc main.o fun1.o fun2.o -o app

虽然可以实现,但如果项目文件多起来,就要输入很多很长的命令

编写第一个Makefile

在目录下创建文件 Makefile,内容遵循以下格式:

目标文件:源文件
(Tab缩进)命令

app: main.o fun1.o fun2.o
    gcc main.o fun1.o fun2.o -o app
main.o: main.c
    gcc -c fun1.c -o fun1.o
fun1.o: fun1.c
    gcc -c fun2.c -o fun2.o
fun2.o: fun2.c
    gcc -c main.c -o main.o

然后执行指令:make,即可编译链接生成可执行文件

Makefile的简化

初步简化

通过变量和模式规则,减少输入

obj = main.o fun1.o fun2.o
target = app
CC = gcc
$(target): $(obj)
    $(CC) $(obj) -o $(target)
%.o: %.c
    $(CC) -c $< -o $@

%.o %.c 即所有的.o、.c后缀的文件

自动变量$<、$@,依赖文件和目标

缺点:obj要一个一个输入

进一步简化

  1. wildcard
    扩展通配符,表示搜索指定文件,比如
    src = $(wildcard ./*.c)
    代表在当前目录下搜索所有.c文件,然后赋值给src

  2. patsubst
    替换通配符,
    obj = $(patsubst %.c,%.o,$(src))
    代表将src中所有的.c替换成.o

  3. make clean
    通过编写.PHONY clean,在执行make clean时可以删除中间文件

src = $(wildcard ./*.c)
obj = $(patsubst %.c, %.o, $(src))
target = app
CC = gcc
$(target):$(obj)
    $(CC) $(obj) -o $(target)
%.o:%.c
    $(CC) -c $< -o $@
.PHONY: clean
clean:
    rm -rf $(obj)

Makefile 快速入门

标签:int   扩展   源文件   命令行   初步   后缀   自动   编译链接   内容   

原文地址:https://www.cnblogs.com/cyanzll/p/14318252.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!