文章目录
Makefile 中提取相同的部分,makefile条件判断,循坏,函数定义,make编译整个项目流程
创建三个测试文件a.cpp,b.cpp,c.cpp
c.cpp
//
// Created by on 2024-01-23.
//
extern void fun1();
extern void fun2();
#include <iostream>
int main(){
fun1();
fun2();
return 0;
}
a.cpp
//
// Created by on 2024-01-23.
//
#include <iostream>
void fun1(){
printf("fun1\n");
}
b.cpp
//
// Created by on 2024-01-23.
//
#include <iostream>
void fun2(){
printf("fun2\n");
}
Makefile
TARGET=c
OBJ=a.o b.o c.o
$(TARGET):$(OBJ)
$(CXX) $^ -O $@
%.O:%.cpp
gcc -c $^ -o $@
clean:
$(RM) $(TARGET) $(OBJ)
试一下,没问题
加上伪目标 ,然后注释掉下面这两行试一下
也是阔以的
新建一个文件夹test01
里面新建x.c,y.c,z.c三个文件
在这个文件夹里面也写一个makefile文件
也是阔以成功编译的
现在我们test01文件夹里面的内容基本和外面的文件夹的内容一致
把外面这些a.cpp,b.cpp,c.cpp以及makefile文件放入一个文件夹中管理
我们把makefile中相同的部分提取出来,在最外层创建一个makefile文件
包含一下
运行试一下
列出所有的文件
替换文件,test01,test02里面的OBJ就阔以删除了
cpp文件替换成.o文件
但是我们test01中的文件并没有发生替换
加一句
运行一下
创建个test03文件进行测试其他项
发现并没有输出123 全是输出456
= 赋值,但是用终值,就是不管变量调用写在赋值前还是赋值后,调用时都是取终值
:= 也是赋值,但是只受当前行及之前的代码影响,而不会受后面的赋值影响
因为A最终赋值是456
再看个例子
A = 123
B = $(A)
A = 456
a:
echo $(A) $(B)
X=789
Y=$(X)abc
Y:=$(Y)def#此处给变量Y赋值,则会认为Y没有存在过,然后等号右边的引用就会出错,因>为不能引用一个不存在的变量
b:
echo $(X) $(Y)
1.makefile条件判断
ifeq判断是否相等,相等返回 true,不相等返回 false
ifneq 判断是否不相等,相等返回 true,不相等返回 false
ifdef 判断变量是否存在,存在返回 true,不存在返回 false
lfndef 判断变量是否不存在,不存在返回 true,存在返回 false
A:=123
RS1:=
RS2:=
RS3:=
RS4:=
ifeq ($(A),123)
RS1:=yes
else
RS1:=no
endif
all:
echo $(RS1)
运行一下,输出yes表示RS1=123
lfeq,ifneq 与条件之间要有空格,不然会报错
嵌套判断
A:=321
RS1:=
RS2:=
RS3:=
RS4:=
ifeq ($(A),123)
RS1:=yes
else
ifeq ($(A),321)
RS1:=321
else
RS1:=no-123-321
endif
endif
all:
echo $(RS1)
可以只有 if,没有 else,
但是没有 elseif 的用法,如果要实现 elseif,就要写嵌套
2.makefile循环语句
TARGET=a b c d
all:
echo $(TARGET)
echo $(foreach v, $(TARGET), $v)
~
循环输出
touch命令,创建文件
循环创建也可以
区别是什么呢,循环创建阔以指定文件的后缀类型
3.makefile函数定义
define FUNC1
echo fun1
endef
all:
$(call FUNC1)
使用
4.项目的make-install的步骤
1将源文件编译成二进制可执行文件(包括各种库文件)
2 创建目录,将可执行文件拷贝到指定目录(安装目录)
3 加全局可执行的路径
4 加全局的启停脚本
5重置编辑环境,删除无关文件