Makefile $@ $^ $< 三个常用变量

本文章示例代码来自别人博客,但是直接考下来,确实有坑,对于初学者十分不理,我亲自把代码实现一遍之后,再放上来,保证代码可以正确运行,请读者放心使用。

一个main程序依赖其余四个文件,包括两个源文件,两个头文件

main.c

#include"mytool1.h"
#include"mytool2.h"
int main(void)
{
mytool1_print("hello1");
mytool2_print("hello2");
return 0;
}


//mytool1.c
#include<stdio.h>
#include"mytool1.h"
void mytool1_print(char *print_str)
{
printf("this is mytool1 print %s",print_str);
}

//mytool1.h
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H

void mytool1_print(char *print_str);
#endif

//mytool2.c
#include "mytool2.h"
#include <stdio.h>
void mytool2_print(char *print_str)
{
printf("this is mytool2 print %s",print_str);
}

//mytool2.h
#ifndef _MYTOOL_2_H


#define _MYTOOL_2_H

void mytool2_print(char *print_str);
#endif

最普通的makefile写法如下:

main: main.o mytool1.o mytool2.o
        gcc -o main main.o mytool1.o mytool2.o

main.o : main.c mytool1.h mytool2.h
        gcc -c main.c
mytool1.o : mytool1.c mytool1.h
        gcc -c mytool1.c
mytool2.o : mytool2.c mytool2.h
        gcc -c mytool2.c
.PHONY: clean
clean: 
        rm main *.o


Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是: 

$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。 

如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为: 

# 这是简化后的Makefile

main: main.o mytool1.o mytool2.o
         gcc -o $@ $^

main.o : main.c mytool1.h mytool2.h
        gcc -c $<
mytool1.o : mytool1.c mytool1.h
        gcc -c $<
mytool2.o : mytool2.c mytool2.h
        gcc -c $<
.PHONY: clean
clean: 
        rm main *.o

个人感觉对于新手先假话到这里即可,以后随着学习的深入和掌握的熟练程度,再次学习更加高深的写法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Makefile 是一种文本文件,它包含了一系列规则用来告诉 make 工具如何编译和链接代码。Makefile 的主要作用是自动化构建过程,让开发人员不需要手动编译每个文件,而是通过一个简单的命令来完成整个项目的编译和构建。 下面是一个简单的 Makefile 文件示例: ```makefile CC=gcc CFLAGS=-Wall -O2 -g all: program program: main.o foo.o bar.o $(CC) $(CFLAGS) $^ -o $@ main.o: main.c $(CC) $(CFLAGS) -c $< -o $@ foo.o: foo.c $(CC) $(CFLAGS) -c $< -o $@ bar.o: bar.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f *.o program ``` 这个 Makefile 包含了三个目标,分别是 `all`、`program` 和 `clean`。其中,`all` 是一个伪目标,它依赖于 `program` 目标;`program` 目标依赖于三个目标文件 `main.o`、`foo.o` 和 `bar.o`;`clean` 目标用来清除所有目标文件和可执行文件。 下面是每个目标的具体规则: - `all` 目标:如果执行 `make all` 命令,则会先执行 `program` 目标。 - `program` 目标:如果执行 `make program` 命令,则会根据 `main.o`、`foo.o` 和 `bar.o` 三个文件生成可执行文件 `program`。 - `main.o`、`foo.o` 和 `bar.o` 目标:分别根据对应的源文件生成目标文件。 - `clean` 目标:如果执行 `make clean` 命令,则会删除所有目标文件和可执行文件。 在 Makefile 文件中,可以使用变量来代替一些常用的命令和选项,这样可以方便地修改和管理。例如上面的例子中,`CC` 和 `CFLAGS` 分别代表编译器和编译选项,这些变量可以在整个 Makefile 文件中使用,并且可以根据需要进行修改。 Makefile 还支持条件语句、循环语句等高级语法,可以根据实际需求进行扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值