首页 > 其他分享 >makefile2

makefile2

时间:2022-09-28 15:33:46浏览次数:40  
标签:文件 依赖 name make echo makefile2 cpp

一、make执行解析与实例操作

1、#make 后没有指定,只执行第一个定义。优先执行依赖,依赖没有就依次查找依赖,找到后执行依赖生成文件,在继续执行。
make -s #不打印输出命令

例1:
OBJ=name.o sk.o jk.o #定义变量
name.o: OBJ #定义make执行的函数。(Nj为依赖函数,优先执行。)
@echo "run command"
gcc -c NJ -o NJ.o
NJ:
@echo "dependency function"

例1.1:
$^ 所有不重复依赖
OBJ=name.o sk.o jk.o #定义变量
%.o: OBJ #定义make执行的函数(Nj为依赖函数,优先执行。 ),%.o自动匹配上面的name.o sk.o jk.o
@echo "run command" #echo前加@可以不打印命令行,相当于make -s
gcc -c $^ -o $@ #-o 指向生成文件,$^不重复依赖,指向上面的依赖.$@目标文件的完整名称
OBJ:
@echo "dependency function"

2.变量
变量名=变量值
使用:$(变量)/$(变量)

传参: make -f Makefile flag=345 #flag为参数定义
3.伪目标: 声明为伪目标,makefile将不会判断目标是否存在或该目标是否需要更新,(根据指定的命令直接执行这个文件,并打印结果)与make直接调用makefile文件命令无关
.PHONY: all clean

4.模式匹配:%目标:%依赖

%.o%.cpp .o依赖对应的.cpp #配皮文中所有*.o的文件,目标和依赖相同部分可以匹配.重复依赖不再执行

wildcard $(wildcard ./*.cpp) #获取当前目录下的所有.cpp文件
patsubst $(patsubst %.cpp,%.o,%*.cpp) #将对应的cpp文件名替换成.o文件

5.动态链接库:.dll .so 库文件(运行时才加载)
libtest.so #库名书写规则前要有个lib**.so

void func(); #定义函数
virtual void func(); #虚函数

6.静态库: .a 库文件

7.通用部分用include

8.公共头文件
8.1 = 赋值,但是取得是最后一个赋值命令赋的值(只能赋予固定值)
例1:
A=123
B=${A}
echo $A $B 输出值为456 456
A=456
B=${B} #${B}不能直接应用。会报错

8.2 := #可以直接应用上面赋值命令,取上面第一个赋予的值,而不是最终值
例2:
A=123
B=${A}
echo $A $B 输出值为123 123
A=456
B:=${B} #${B}可以递归应用

9.shell命令
A:=$(shell ls)
B:=$(shell pwd)
c:=$(shell if [ ! f abc ];then touch abc; fi)

10.-C 指定工作目录
make -C ../
make -C ../ clean

11.条件判断,没有elseif或elseifdef,只能用嵌套形式

ifeq 判断是否相等,相等返回ture,不相等返回false
ifneq 判断是否不相等,不相等返回ture,相等返回false
ifdef 判断是否存在
ifndef 判断是否不存在

例:
a:= 123
name:=
ifeq ($(a),123)
name=yes
else
ifeq ($(a),321)
name=no
else
name=yes
endif
endif

12.循环:makefile中只有一个循环foreach,只支持GUN Make。
其他平台make可以用shell的循环实现
TARGET= A B C
all:
echo $(TARGET)
echo $(foreach v,$(TARGET),$v)
touch $(foreach v,$(TARGET),$v.text) #可创建A.text B.text C.text
clean:
$(RM) -rf $(TARGET) *text

13,调用函数:call
例:
define FUNC
echo $0 #$0为函数自己的名称。输出FUNC
echo func1
echo $1 $2
endef

all:
$(call FUNC) #调用函数
$(call FUNC,abd,nak) #abd,nak传参,传参给$1,$2


例:
.cpp文件需要g++进行编译,生成*.out文件(可直接运行)

 

标签:文件,依赖,name,make,echo,makefile2,cpp
From: https://www.cnblogs.com/JASON-yul/p/16738253.html

相关文章