CMAKE、MAKE、SHELL
约 839 字大约 3 分钟
2026-01-28
CMAKE、MAKE、SHELL
MAKE
makefile编译原理
main: main.o input.o calcu.o
gcc -o main main.o input.o calcu.o
#变量引入
objects = main.o **.o
main: $(objects) #用变量替代main.o **.o等变量赋值的规则
=等应用叫做后赋值
name = zzk
curname = $(name)
name = zuo
print:
@echo curname: $(curname)
#这个makefile触发之后打印输出`zuo`- ":="就是直接赋值
name = zzk
curname := $(name)
name = zuo
print:
@echo curname: $(curname)
#这个地方就是打印"zzk"- "?="
name = zzk
curname ?= zuo
name = zuo
print:
@echo curname: $(curname)
#这个地方就是打印"zuo",意味如果没有对curname进行定义就会按照这个后面给curname进行赋值+=
顾名思义就是讲新定义内容加入到对应的Object里面
makefile的模式规则
eg:
objects = main.o input.o calcu.o
main: $(objcets)
gcc -o main $(objects)
%.o : %.c
#命令
clean:
rm *.o
rm main
#`%`代表一个通配符,这个要结合makefile自动化变量| 自动化变量 | 描述 |
|---|---|
| $@ | 规则中目标集合,如果在模式规则中有多个目标,那么$@表示匹配模式中定义的目标集合 |
| $% | 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值是空 |
| $< | 依赖文件集合中的第一个文件,如果依赖文件是以模式(%)定义,那么该变量就是符合模式的一系列文件多的集合 |
| $? | 所有比依赖文件新的依赖目标文件集合,用空格进行分割 |
| $^ | 所有依赖文件的集合,使用空额分隔,如果在依赖文件中存在多个重复文件,$^会除去重复文件,保留一份 |
| $+ | 和上面$^类似,但是当依赖文件存在重复的话不会除去重复的依赖文件 |
| $* | 这个变量表示目标模式中%及之前的部分,如果目标文件是test/a.test.c目标模式是a.%.c那么$*表示test/a.test |
伪目标
伪目标存在的意义是防止真正目标和想要用的一些目标冲突
clean:
rm *.o
rm main
#make clean会调用这两行,但是当真的创造了一个clean的目标文件就不会再调用这里
#所以解决方案就是通过
.PHONY : clean# 声明成伪目标MAKEFILE函数
makefile条件判断
ifeq ifneq
SHELL
鸟哥私房菜
# !bin/bash/ 脚本必须有本行
echo "hell world"
echo "input"
read name
echo "name = $name"
#而对于表达式需要使用$((表达式))
echo -p "age height " age height
taoal=$(($age + $height))
#test 判断
#[]里面的字符串一定要加双引号,并且需要有空格 [ == ] 或 [ != ]
[ "$str" == "$str2" ]
#shell的默认标号
$0-$n
#$0表示shell脚本名字
#余下表示启动脚本时候输入的参数名
#if 语句判断
# && 和 ||实现简单的条件判断,但是复杂一点的场景就不合适了。
if [ 条件判断 ]; then
# 判断成立要做的事情
fi
还有if then else 语句, 写法
if 条件判断 ; then
#//条件成立要做的事情
else
#//条件不成立要做的事情
fi
if 条件判断 ;then
# 条件判断成立
elif[ 条件判断 ];then
#条件判断成立
else
#条件判断成立
fi
#case 语句判断
case $变量 in
"first 变量")
程序段
;;
"second 变量")
程序段
;;
esac
eg:
case $1 in
"a")
echo "praram a"
;;
"b")
echo "param b"
;;
esac