$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件

$@是目标的名字(目标就是冒号":"左边的文件名)。假如冒号左边有不止一个目标,那么$@等于触发当前规则的那个目标。

$<是第一个依赖项(依赖项就是冒号":"右边的文件名)。

当冒号“:”左边有多个目标时,$@一次只会对应一个目标

CC=gcc

%.o: %.cpp
$(CC) -c -o $@ $<
main: main.o fun.o
$(CC) -o $@ $^

$@对应%.o;而$<对应%.cpp

最后一行。$@取代了main,因为$@就代表main。$^取代了main.o fun.o。因为$^的作用就是代替冒号":"右边的所有依赖项(prerequisites)

例子与说明:

#目标 ... : 依赖 ...
# 命令1
# 命令2
# . . . CC = gcc
# -Wall:选项可以打印出编译时所有的错误或者警告信息
# -O: 默认优化等级
# -O0: 表示编译时没有优化。
# -O1: 表示编译时使用默认优化。
# -O2: 表示编译时使用二级优化。
# -O3: 表示编译时使用最高级优化。
# -Os:相当于-O2.5优化,
CFLAGS = -Wall -O PWD_DIR = $(shell pwd) BSDIFF_DIR = $(PWD_DIR)/bsdiff
LIB_DIR = $(PWD_DIR)/lib
LZMA_DIR = $(PWD_DIR)/lzma
MAIN_DIR = $(PWD_DIR)/main INCLUDE = -I$(PWD_DIR)/include -I$(BSDIFF_DIR) -I$(LIB_DIR) -I$(LZMA_DIR) -I$(MAIN_DIR) -I./ TARGET = bsdiff_lzma_recover # wildcard 是GNU make程序预定义的一个函数,作用便是获取匹配模式文件名,原型为$(wildcard PATTERN)
# 获取目录下的所有.c文件
SRCS = $(wildcard $(BSDIFF_DIR)/*.c) \
$(wildcard $(LIB_DIR)/*.c) \
$(wildcard $(LZMA_DIR)/*.c) \
$(wildcard $(MAIN_DIR)/*.c) \
$(wildcard *.c) # 模式替换函数patsubst函数原型为$(patsubst PATTERN,REPLACEMENT,TEXT)
# 把所有.c替换成.o
OBJS = $(patsubst %.c, %.o, $(SRCS)) # 这条语句把所以的目录路径导出,给子Makefile使用。
#export CC CFLAGS PWD_DIR FUNC_DIR MAIN_DIR OBJ_DIR INCLUDE # $^ 表示所有的依赖文件
# $@ 表示生成的目标文件
# $< 代表第一个依赖文件 $(TARGET): $(OBJS)
$(CC) $^ -o $@ $(CFLAGS) $(INCLUDE) # 它的含义是所有“.o”文件的依赖文件是对应的“.c”文件
%.o: %.c
$(CC) -c $< -o $@ $(CFLAGS) $(INCLUDE) .PHONY: clean # clean,手册里说:“make存在一个内嵌隐含变量“RM”,它被定义为:“RM = rm –f”。
# 因此在书写“clean”规则的命令行时可以使用变量“$(RM)”来代替“rm”,这样可以免出现一些不必要的麻烦!
# ”虽然不知道“必要的麻烦”是什么,但是小心不为过,照着手册做比较好
clean:
$(RM) $(TARGET)
$(RM) $(OBJS)

随机推荐

  1. 补充停牌的日K数据

    问题 从TuShare获取的数据,停牌日是没有数据的,这将会在回测时,不能直接参与账户的净值计算,导致账户的净值以及收益计算不准确. 停盘 股票由于某种消息或进行某种活动引起股价的连续上涨或下跌,由证 ...

  2. sympy简明用法

    系统学习Sympy 什么是Sympy Sympy 是一个可以进行符号运算的第三方科学计算库,数学对象可以被精确的表达,而不是近似值,这也意味着带有未计算的未知量可以以符号的形式留在数学表达式中. im ...

  3. 基于AI的智能农业病虫害识别系统实战指南

    引言 在农业现代化进程中,病虫害防治始终是保障粮食安全的核心挑战.传统人工识别方式存在效率低.误判率高.响应滞后等问题.本文将通过完整的技术实现流程,展示如何利用Python生态构建智能病虫害识别系统 ...

  4. Java stream sorted自定义排序规则实现多字段排序

      Stream 提供了丰富的操作(中间操作和终端操作)集合元素的轮子,但Stream流操作不影响原始集合数据,执行结果是一个新的集合对象.在<Java stream sorted使用 Comp ...

  5. java客户端发送socket消息到指定服务并接收响应

    做个笔记 /** * 发送socket到指定服务 * 接收有6位报文头长度的响应,支持读取分包 * * @param host IP * @param port 端口 * @param msg 消息内 ...

  6. kubernetes集群calico网络组件部署

    一.使用问题背景 关于Calico组件介绍,我们在这个章节已经介绍过. 这里使用Calico组件,是因为集团安全测试通过容器内部检测出内网主机暴露的端口,内网主机的端口暴漏会造成严重的安全风险. 扫描 ...

  7. PHP中关于static的使用方法

    本文由 ChatMoney团队出品 PHP,作为一种面向对象的编程语言,为开发者提供了丰富的特性和功能,助力构建高效的应用程序.其中,static关键字在类和方法中的应用尤为重要,它提供了一种独特的变 ...

  8. SAP 发布简易REST 一:login验证

    说明:这里没有使用ODATA,只是用最基础的HTTP和JSON来处理. 这篇为第一篇,所以这里来说说验证的一些东西. 创建SE24实施类,做http接口:ZCRM_REST 激活后,添加接口类:IF_ ...

  9. ET5 MailBoxComponent 简单介绍

    根据ET5文档介绍,MailBoxComponent组件一般与Actor搭配使用,挂载该组件后,就可以通过Actor发送消息. 官方demo主要有两种使用方式: session.AddComponen ...

  10. 关于用PHP连接Mysql后添加数据,中文变成问号的解决方案

    这主要是编码问题,确认你在网页制作软件时所设定的编码,要与mysql的编码一致就可以解决 问题如下图: 打开这个表的操作页面,按下图设置: 排序规则里设置成你网页的编码方式,注意,要点选下面的Chan ...