Makefile 中提取相同的部分,makefile条件判断,循坏,函数定义,make编译整个项目流程

本文详细介绍了如何在Makefile中使用条件判断(ifeq,ifneq,ifdef,ifndef),循环语句,函数定义以及项目编译的make-install步骤。作者通过实例演示了如何管理多个cpp文件,提取重复的Makefile部分,并展示了makefile在项目管理和编译过程中的实际操作。
摘要由CSDN通过智能技术生成

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重置编辑环境,删除无关文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值