gcc编译demo+Makefile使用

本文详细介绍了如何使用GCC进行分步编译和直接编译链接C程序,以及如何利用Makefile自动化编译过程。Makefile的规则、变量、模式规则、自动化变量和伪目标等功能被逐一解析,旨在提高开发效率并简化工程管理。同时,文章还提到了Makefile中的条件判断和函数使用,使其更加灵活和强大。
一、gcc编译demo
//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); 
}

//calcu.c
#include "calcu.h"
int calcu(int a, int b)
{
	return (a + b);
}

//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");
}

//calcu.h
#ifndef _CALCU_H
#define _CALCU_H
int calcu(int a, int b);
#endif

//input.h
#ifndef _INPUT_H
#define _INPUT_H
void input_int(int *a, int *b);
#endif

方法1:把c文件编译成.o文件,再链接成可执行文件

gcc -c main.c 
gcc -c input.c 
gcc -c calcu.c 
gcc main.o input.o calcu.o -o main 

方法2:把c文件直接编译链接成可执行文件

gcc -o main main.c input.c calcu.c
gcc main.c input.c calcu.c -o main 
二、Makefile使用
1. Makefile

为此我们需要这样一个工具: 1、如果工程没有编译过,那么工程中的所有.c 文件都要被编译并且链接成可执行程序。 2、如果工程中只有个别 C 文件被修改了,那么只编译这些被修改的 C 文件即可。 3、如果工程的头文件被修改了,那么我们需要编译所有引用这个头文件的 C 文件,并且 链接成可执行文件。 很明显,能够完成这个功能的就是 Makefile 了,在工程目录下创建名为“Makefile”的文件, 文件名一定要叫做“Makefile”!区分大小写的!

目标…… : 依赖文件集合……
命令 1
命令 2 ……

main : main.o input.o calcu.o 
	gcc -o main main.o input.o calcu.o

make 命令会为 Makefile 中的每个以 TAB 开始的命令创建一个 Shell 进程去执行。
示例:

main: main.o input.o calcu.o
	gcc -o main main.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
2. Makefile变量

Makefile 中的变量都是字符串,类似 C 语言中的宏。
#Makefile 变量的使用 Makefile 中可以写注释,注释开头要 用符号“#”,不能用 C 语言中的“//”或者“/**/”!

objects = main.o input.o calcu.o 
main: $(objects) 
	gcc -o main $(objects)

使用到了变量 objects, Makefile 中变量的引用方法是“(变量名)”,比如本例中的“(变量名)”,比如本例中的“()(objects)”就是使用变量 objects。
语法:
赋值符“=” 多次赋值,以最后一次为准
赋值符“:=” 用“:=”赋值后,再用“=”赋值,不会改变变量值
赋值符“?=” 前面有赋值就用前面的,没有就用现在的
变量追加“+=”用于追加字符串

objects = main.o inpiut.o 
objects += calcu.o
3. Makefile 模式规则

模式规则中,至少在规则的目标定定义中要包含“%”,否则就是一般规则,目标中的“%” 表示对文件名的匹配,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的文件件,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。

objects = main.o input.o calcu.o 
main: $(objects) 
	gcc -o main $(objects) 
%.o : %.c 
	#命令      使用“自动化变量 ”
clean: 
	rm *.o 
	rm main
4. Makefile 自动化变量

所谓自动化变量就是这种变量会把模式中所 定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完, 自动化变量只应该 出现在规则的命令中,常用的三种:@、@、@<、$^
在这里插入图片描述

objects = main.o input.o calcu.o 
main: $(objects) 
	gcc -o main $(objects) 
%.o : %.c 
	gcc -c $< 
clean: 
	rm *.o 
	rm main
5. Makefile 伪目标

Makefile 有一种特殊的目标——伪目标,一般的目标名都是要生成的文件,而伪目标不代 表真正的目标名,在执行 make 命令的时候通过指定这个伪目标来执行其所在规则的定义的命令。
使用伪目标的主要是为了避免 Makefile 中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突

clean: 
	rm *.o 
	rm main

工作目录下也有一个“clean”文件,再make clean时,规则因为没有依赖文件,所以目标被认为是最新的,因此后面的 rm 命令也就不会执行,我 们预先设想的清理工程的功能也就无法完成。
在这里插入图片描述
在这里插入图片描述
修改如下:

objects = main.o input.o calcu.o 
main: $(objects) 
	gcc -o main $(objects) 
.PHONY : clean
%.o : %.c 
	gcc -c $< 
clean: 
	rm *.o 
	rm main

声明 clean 为伪目标以后不管当前目录下是否存在名 为“clean”的文件,输入“make clean”的话规则后面的 rm 命令都会执行。

6. Makefile 条件判断

在这里插入图片描述
条件关键字有 4 个:ifeq、ifneq、ifdef 和 ifndef
ifdef <变量名>
如果“变量名”的值非空,那么表示表达式为真,否则表达式为假。“变量名”同样可以是 一个函数的返回值。

7. Makefile 函数使用

Makefile 支持函数,类似 C 语言一样,Makefile 中的函数是已经定义好的,我们直接使用, 不支持我们自定义函数。
函数的用法如下:$(函数名 参数集合) 或者 ${函数名 参数集合}
函数 subst用来完成字符串替换
函数 patsubst 用来完成模式字符串替换
函数 dir 用来获取目录
函数 notdir 看名字就是知道去除文件中的目录部分,也就是提取文件名
foreach 函数用来完成循环
函数 wildcard

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值