首页 > 其他分享 >makefile实操准备

makefile实操准备

时间:2023-08-27 17:33:17浏览次数:117  
标签:%. makefile 目标 实操 clean 准备 cpp hello

(目录)


一、系统变量

系统变量 描述
$* 不包括扩展名的目标文件名称
$+ 所有的依赖文件,以空格分隔
$< 表示规则中的第一个依赖项
$? 所有时间戳比目标文件晚的依赖文件,以空格分隔
$@ 目标Target的完整名称
$^ 所有不重复的依赖文件,以空格分隔
$% 如果目标是归档成员,则该变量表示目标的归档成员名称

二、系统常量

可用 make -p 查看

系统常量 描述 默认值
AS 汇编程序的名称 默认值为 as
CC C编译器名称 默认值为 cc
CPP C预编译器名称 默认值为 cc -E
CXX C++编译器名称 默认值为 g++
RM 文件删除程序别名 默认值为 rm -f

注意:#为注释。

三、自定义变量

定义:VAR_NAME = VALUE 使用:$(VAR_NAME) 或 ${VAR_NAME}

注意:makefile中的变量是大小写敏感的。

四、伪目标和模式匹配

makefile默认先处理第一个目标。

1. 伪目标

.PHONY:clean

声明目标为伪目标之后,makefile将不会判断目标是否存在或该目标是否需要更新。

2. 模式匹配

符号 说明 备注
%.o:%.cpp .o依赖于对应的.cpp文件 通配符
wildcard $(wildcard ./*.cpp) 获取当前目录下所有的.cpp文件名 空格分隔
patsubst $(patsubst %.cpp, %.o, ./*.cpp) 将xxx.cpp文件名替换成对应的xxx.o文件名

五、基本使用

# 目标: 依赖
# $@ 目标;$< 第一个依赖;$^ 所有依赖

# 通过include指令可以包含其他makefile文件
# include ../makefile

# 不使用默认值cc
#CC=gcc

# 注意:hello后边#之前的空格也会作为赋值字符串的一部分
TARGET=hello # := 可以阻止递归展开的效果,即只展开一次再赋值(从上到下逐步展开)
# 当前目录下的所有.cpp文件名都放到SRC变量里
SRC=$(wildcard *.cpp)
# path路径替换:把变量SRC中的文件名(.cpp)替换为.o结尾并赋值给OBJ变量
OBJ=$(patsubst %.cpp, %.o, $(SRC))

CXXFLAGES=-c -Wall -g

$(TARGET): $(OBJ)
    $(CXX) -o $@ $^

%.o: %.cpp
    $(CXX) $(CXXFLAGES) $< -o $@

.PHONY: clean
clean:
    $(RM) $(OBJ) $(TARGET)

在包含多文件的情况下可以采用如下方法避免重复赋值带来的递归展开问题

ifndef TARGET
	TARGET:=hello 
endif

六、调用shell

PWD:=$(shell pwd)

七、嵌套调用

# -C 指定目录,调用其中的Makefile。或者使用-f 指明文件名。
all:
	$(MAKE) -C ./dir1
	$(MAKE) -C ./dir2
	$(MAKE) -C ./dir3 -f makefile03
clean:
	make -C ./dir1 clean
	make -C ./dir2 clean
	make -C ./dir3 -f makefile03 clean

或者优化为

DIR=dir1 dir2 dir3
.PHONY:$(DIR) clean

all:$(DIR)
$(DIR):
	make -C $@
clean:
	@echo $(shell for dir in $(DIR); do make -C $$dir clean; done)

八、makefile中的条件判断

判断指令 描述 返回值
ifeq 判断是否相等 相等返回true,不相等返回false
ifneq 判断是否不相等 相等返回true,不相等返回false
ifdef 判断变量是否存在 存在返回true,不存在返回false
ifndef 判断变量是否不存在 不存在返回true,存在返回false

ifeq,ifneq与条件之间要有空格,否则报错。 没有elseif的用法,如果要实现,则必须使用嵌套。

ifeq ($(A), 123)
	RET1:=yes
else
	ifneq ($(B), balabala)
		RET1:=p1
	else
		RET1:=p2
	endif
	RET1:=no
endif

ifdef C
        C:=123
else
        C=123
endif

ifndef PARAM_NAME
	PARAM_NAME=mufasa
endif

注意:make可以通过命令行参数PARAM_NAME=VALUE向makefile中的PARAM_NAME自定义变量传参。 make PARAM_NAME=VALUE

九、makefile中的循环

.PHONY:show

VAR=a b c d
FILE=$(foreach V, $(VAR), $V.txt)
ATTR=$(wildcard *.c)

show:
        @echo $(FILE)
        @for A in $(ATTR); do ls -l $$A; done;

显然使用shell命令的方式灵活性更强。

十、自定义函数

.PHONY:show

define func
        @echo func
        @echo $(1) $(2)
endef

show:
        $(call func, 123, abc)

函数没有返回值。

十一、install的实现

.PHONY:install
install:
	install -o bee -g bee -m 666 --suffix=.old hello.asm ./dir/hello.asm

以上命令的解释如下:

  • -o bee:将目标文件所有者设置为bee用户。
  • -g bee:将目标文件属组设置为bee。
  • -m 666:将目标文件的权限设置为rw-rw-rw-。
  • hello.asm:源文件的名称。
  • ./dir/hello.asm:目标文件的路径名。
  • --suffix=.old:如果目标文件已经存在,则将目标文件备份为hello.asm.old,并将新的源文件复制为hello.asm。

标签:%.,makefile,目标,实操,clean,准备,cpp,hello
From: https://blog.51cto.com/cerana/7253762

相关文章

  • Makefile练习1:静态库/动态库的生成和使用
    自己动手写下Makefile,并记录备忘。工程目录如下一、生成静态库libAdd.a1、头文件add.h#include<stdio.h>intadd(inta,intb);2、源文件add.c#include"add.h"intadd(inta,intb){ return(a+b);}3、Makefile(1)入门版libAdd.a:add.o ar-rlibAdd.aad......
  • AI绘画StableDiffusion美女实操教程:斗破苍穹-小医仙-天毒女(附高清图下载)
    小医仙,是天蚕土豆所著玄幻小说《斗破苍穹》([1])及其衍生作品中的角色,身负厄难毒体,食毒修炼,万毒不侵,通体毒气。这种会无意识地杀死别人的体质让天性善良的小医仙成为人憎鬼厌的天毒女,在萧炎多次帮助下得以控制。出图效果展示:资源整合:今天我们就来一波实操,如何用lora包生成超真......
  • delphi FastReport 保存和加载已准备的报表
    FastReport保存和加载已准备的报表属性和方法TfrxReport.PreviewPagespropertyPreviewPages:TfrxCustomPreviewPages;指向已完成报表的当前页面的链接。它用于与完成的报表相关的所有操作(打印、保存、导出等)。TfrxCustomPreviewPages.LoadFromFilefunctionLoadFromFile......
  • AI绘画StableDiffusion美女实操教程:斗破苍穹-小医仙
    之前分享过StableDiffusion的入门到精通教程:AI绘画:StableDiffusion终极炼丹宝典:从入门到精通但是还有人就问:安装是安装好了,可是为什么生成的图片和你生成的图片差距那么远呢?怎么真实感和质感一个天一个地呢?出图效果展示:那么,我画的图,和你画的图,差别在哪里呢?很关键的因素,就......
  • Makefile学习笔记
    规则:每条规则由三个部分组成分别是目标(target),依赖(depend)和命令(command)。#示例#规则1app:a.ob.oc.ogcca.ob.oc.o-oapp#规则2a.o:a.cgcc-ca.c#规则3b.o:b.cgcc-cb.c#规则4c.o:c.cgcc-cc.c makefile有自动推导功能,有时漏......
  • 对话无服务器专家 Luca Mezzalira:你真的为 Serverless × AI 做好准备了吗?
    无服务器架构是当下云计算领域最热门的趋势之一。据统计,只有35%的技术人员还没有使用无服务器平台,越来越多的企业出于降低成本、简化运维、加快产品上市速度等原因选择转向无服务器架构。那么,开发人员该如何转变自己的开发方式以适应和充分利用无服务器架构,在业务快速变化的情况......
  • 做好这些前期准备,搭建产品手册文档超简单!
    looklook最近后台收到不少私信,有很多小伙伴都想了解一下产品手册文档相关的资料。looklook决定就开一个系列的文章,从搭建产品手册文档的前期准备出发,一步步地教大家成功搭建出一个完美的搭建产品手册文档。搭建产品手册文档的前期准备1.明确目标和定位:确定搭建产品手册文档的目的和......
  • 年薪40W,如何高效准备大厂AI算法岗面试?
    如果说求职是人生的一道坎,那么面试就是最难翻越的那一块砖。当你经历过大大小小的面试之后,就会发现不同的公司、不同的面试官问的问题都大同小异,因为企业对于挑选人才是有一些共性的要求的,只要在面试前根据高频问题提前准备,命中率几乎等于100%!但是,为什么还有很多技术精湛、经验丰富......
  • 8.makefile-gdb-文件IO
    8.makefile-gdb-文件IO学习目标:熟练使用规则编写简单的makefile文件熟练使用makefile中的变量熟练使用makefile中的函数熟练掌握gdb相关调试命令的使用了解概念:pcb和文件描述符,虚拟地址空间熟练掌握Linux系统IO函数的使用1.makefilemakefile文件中定义了一系列的规则......
  • Kubernetes编程—— 编写 Operator 的方案 —— 1、准备工作
    编写Operator的方案——1、准备工作 1、安装好并完成正确配置的Go1.12或以上版本:Go是Golang的开发工具包,需要安装并配置正确的环境变量,以便在命令行中编译、构建和运行Go程序。确保已从官方网站或中文社区网站下载并安装了适合自己操作系统的Go版本,并将相关的bin目录添加......