【嵌入式Linux】09-Ubuntu-Makefile

此笔记由个人整理

塞上苍鹰_fly

课程来自:正点原子_手把手教你学Linux

一、简介

  • 当源码文件比较多的时候就不适合通过直接输入gcc命令来编译,这时候就需要一个自动化的编译工具
  • make:一般说GNU Make,是一个软件,用于将源代码文件编译为可执行的二进制文件,make工具主要用于完成自动化编译。make工具编译的时候需要Makefile文件提供编译文件。只编译更改过的文件,不会重复编译一个文件。
  • Makefile:make工具所使用的文件,Makefile指明了编译规则。

二、前期准备

  • 编写需要使用的文件

  • calcu.c

#include "calcu.h"

int calcu(int a,int b)
{
	return(a+b);
}
  • calcu.h
#ifndef _CALCU_H
#define _CALCU_H

int calcu(int a,int b);

#endif
  • input.c
#include "stdio.h"
#include "input.h"

void input_int(int *a,int *b)
{
	printf("input two num:");
	scanf("%d %d",a,b);
	printf("\r\n");
}
  • input.h
#ifndef _INPUT_H
#define _INPUT_H

void input_int(int *a,int *b);


#endif
  • main.c
#include "stdio.h"
#include "input.h"
#include "calcu.h"

int main(int argc,char *argv[])
{
	int a,b,num;
	
	input_int(&a,&b);
	num = calcu(a,b);
	printf("%d + %d = %d\r\n",a,b,num);
}

三、文件编译

安装环境

  • 安装
sudo apt-get install gcc
  • 安装成功查看版本
gcc -v

image-20200628082816280

一般编译步骤

源文件–>预处理–>编译–>汇编–>链接–>生成二进制可执行文件

  • 预处理
gcc -E 文件名 > 生成文件名	(默认.i文件)
  • 编译
gcc -S 预处理过的文件名		(默认.s文件)
  • 汇编
gcc -C 汇编过的文件名		 (默认.o文件)
  • 链接
gcc .o文件 -o 生成的可执行文件名

编译之前编写的文件

  • 编译
gcc input.c calcu.c main.c -o main
image-20200709162206836
  • 几个文件还行,文件要是多了成百上千个,不可能一个一个输入吧,而且就算你一个一个都输完了,当你修改了其中一个文件时再次编译都是从开头重新编译的,所以就要用到我们的Makefile了

makefile

  • 编写makefile
main:main.o input.o calcu.o					//main所依赖的文件时后面的,如果没有先执行之后规则
	gcc -o main mian.o input.o calcu.o
	
main.o:main.c								//寻找依赖文件,执行之后的编译规则
	gcc -c main.c
input.o:input.c
	gcc -c input.c
calcu.o:calcu.c
	gcc -c calcu.c
	
clean:
	rm *.o
	rm main
  • 使用makefile,输入make,会出来一个main,这就是链接后的可执行文件
image-20200709164155504

四、Makefile语法

规则格式

目标:依赖文件集合
	命令1
	命令2
	......
  • 例如
main:main.o input.o calcu.o
	gcc -o main main.o input.o calcu.o

命令列表中的命令必须以TAB开始,不能使用空格

  • 第一个规则的目标为默认目标,这要这个目标完成了就表示整个makefile完成了

makefile变量

变量名 = 依赖文件
目标: $(变量名)
	gcc -o 目标 $(变量名)
  • 例如
objects = main.o input.o calcu.o
main: $(objects)
	gcc -o main $(objects)
  • 赋值符"="
    • 变量的值取决于最后一次的赋值
name = hct
prname: $(name)
name = huochengtao 
  • 赋值符":="
    • 变量的值取决于前面已经定义好的
name := hct
prname: $(name)
name = huochengtao 
  • 赋值符"?="
    • 判断之前是否定义过,如果定义过就取之前的,如果没有就取这次的
name ?= hct
prname: $(name)
  • 赋值符"+="
    • 通过赋值符可以将已经定义好的变量进行追加
name = hc
name += t

模式规则

  • 在makefile中不可能一个依赖文件就编写条规则,短的还好说,多了就不能一个一个写了,在makefile中有一种类似于c语言中的通配符一样的模式规则"%"
%.o : %.c	

	<-->	

main.o:main.c
	gcc -c main.c
input.o:input.c
	gcc -c input.c
calcu.o:calcu.c
	gcc -c calcu.c
  • 修改之前的makefile
objects = main.o input.o calcu.o
main: $(objects)
	gcc -o main $(objects)

%.o : %.c
	命令
	
clean:
	rm *.o
	rm main

自动化变量

  • $<
    • 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%” )定义的,那么“$<”就是符合模式的一系列的文件集合。
  • $@
    • 规则中的目标集合,在模式规则中,如果有多个目标的话,“$@”表示匹配模式中定义的目标集合。
  • $^
    • 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,“$^”会去除重复的依赖文件,值保留一份。
  • 修改之前的makefile
objects = main.o input.o calcu.o
main: $(objects)
	gcc -o main $(objects)

%.o : %.c
	gcc -c $<
	
clean:
	rm *.o
	rm main

伪命令

  • 一般的目标名都是要生成的文件,而伪目标不代表真正的目标名,在执行 make 命令的时候通过指定这个伪目标来执行其所在规则的定义的命令。
.PHONY:clean
clean:
	rm *.o
	rm main
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值