Makefile编译原理 make 中的路径搜索_2

news2024/11/22 17:15:59

一.make中的路径搜索

VPATH变量和vpath关键字同时指定搜索路径。

实验1 VPATH 和 vpath 同时指定搜索路径

mhr@ubuntu:~/work/makefile1/18$ tree
.
├── inc
│ └── func.h
├── main.c
├── makefile
├── src1
│ └── func.c
└── src2
└── func.c

makefile

VPATH := src1
CFLAGS := -I inc

vpath %.c src2
vpath %.h inc

app.out : func.o main.o
	@gcc -o $@ $^
	@echo "Target File ==> $@"

%.o : %.c func.h
	@gcc $(CFLAGS) -o $@ -c $<

main.c

#include <stdio.h>
#include "func.h"

int main()
{
    foo();
	
    return 0;
}	

src1/func.c

#include <stdio.h>
#include "func.h"

void foo()
{
    printf("void foo() : %s\n", "This file is from src1 ...");
}

src2/func.c

#include <stdio.h>
#include "func.h"

void foo()
{
    printf("void foo() : %s\n", "This file is from src2 ...");
}

inc/func.h

#ifndef FUNC_H
#define FUNC_H

void foo();

#endif


mhr@ubuntu:~/work/makefile1/18$ make
Target File ==> app.out
mhr@ubuntu:~/work/makefile1/18$ ./app.out 
void foo() : This file is from src2 ...
mhr@ubuntu:~/work/makefile1/18$ 

 结果表明 当VPATH 和 vpath 同时指定搜索路径,优先选择 vpath 指定的所搜路径。

改1:

将 src/func.c 改为 src1/func.cpp 会发生什么?
├── inc
│ └── func.h
├── main.c
├── makefile
├── src1
│ └── func.cpp
└── src2
└── func.c

mhr@ubuntu:~/work/makefile1/18$ make
Target File ==> app.out
mhr@ubuntu:~/work/makefile1/18$ 
mhr@ubuntu:~/work/makefile1/18$ ./app.out 
void foo() : This file is from src2 ...
mhr@ubuntu:~/work/makefile1/18$ 

实验结论:

- make首先在当前文件夹搜索需要的文件

- 如果失败:make优先在vpath指定的文件夹中搜索目标文件,当vpath搜索失败时,转而搜索VPATH执行的文件夹。

 

实验2:当使用vpath 对.c文件指定多个文件夹时 
├── inc
│ └── func.h
├── main.c
├── makefile
├── src1
│ └── func.c
└── src2
└── func.c

makefile

CFLAGS := -I inc

vpath %.c src1
vpath %.c src2

vpath %.h inc

app.out : func.o main.o
	@gcc -o $@ $^
	@echo "Target File ==> $@"

%.o : %.c func.h
	@gcc $(CFLAGS) -o $@ -c $<



mhr@ubuntu:~/work/makefile1/18$ make
Target File ==> app.out
mhr@ubuntu:~/work/makefile1/18$ ./app.out 
void foo() : This file is from src1 ...
mhr@ubuntu:~/work/makefile1/18$ 

结论:当makefile中链接两个vpath时,会选择第一个链接到的。

改1

├── inc
│ └── func.h
├── main.c
├── makefile
├── src1
│ └── func.cpp
└── src2
└── func.c

makefile

CFLAGS := -I inc

vpath %.c src1
vpath %.c src2

vpath %.h inc

app.out : func.o main.o
	@gcc -o $@ $^
	@echo "Target File ==> $@"

%.o : %.c func.h
	@gcc $(CFLAGS) -o $@ -c $<

mhr@ubuntu:~/work/makefile1/18$ 
mhr@ubuntu:~/work/makefile1/18$ make
Target File ==> app.out
mhr@ubuntu:~/work/makefile1/18$ ./app.out 
void foo() : This file is from src2 ...
mhr@ubuntu:~/work/makefile1/18$ 

先搜索src1,没有搜索到。再去搜索src2。

改2

├── inc
│ └── func.h
├── main.c
├── makefile
├── src1
│ └── func.cpp
└── src2
└── func.cpp

makefile

CFLAGS := -I inc

vpath %.c src1
vpath %.c src2

vpath %.h inc

app.out : func.o main.o
	@gcc -o $@ $^
	@echo "Target File ==> $@"

%.o : %.c func.h
	@gcc $(CFLAGS) -o $@ -c $<


mhr@ubuntu:~/work/makefile1/18$ make
make: *** No rule to make target 'func.o', needed by 'app.out'.  Stop.
mhr@ubuntu:~/work/makefile1/18$ 

因为 make 在当前路径,src1,src2中都找不到 func.c, 于是make 又发现因事规则中可以通过cpp文件生成.o文件,但是在makefile中 没有找到 哪个vpath关键字指明了有cpp文件,所以找不到文件报错。

实验结论:

- make首先在当前文件夹搜索需要的文件

- 如果失败:make以自上而下的顺序搜索vpath指定的文件夹,当找到目标文件,搜索结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1445998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FRP内网穿透如何避免SSH暴力破解(二)——指定地区允许访问

背景 上篇文章说到&#xff0c;出现了试图反复通过FRP的隧道&#xff0c;建立外网端口到内网服务器TCP链路的机器人&#xff0c;同时试图暴力破解ssh。这些连接造成了流量的浪费和不必要的通信开销。考虑到服务器使用者主要分布在A、B、C地区和国家&#xff0c;我打算对上一篇…

万维网的文档

目录 1 万维网的文档 动态万维网文档 CGI CGI 网关程序 活动万维网文档 用 Java 语言创建活动文档 1 万维网的文档 分为&#xff1a; 静态万维网文档。内容不会改变。简单。(html、xml、css) 动态万维网文档。文档的内容由应用程序动态创建。 活动万维网文档。由浏览器端…

npm config set registry https://registry.npm.taobao.org 这个设置了默认的镜像源之后如何恢复默认的镜像源

要恢复npm默认的镜像源&#xff0c;你可以使用以下命令将registry设置回npm的官方源&#xff1a; npm config set registry https://registry.npmjs.org/这个命令会修改你的全局npm配置&#xff0c;将包的下载源改回npm官方的源。这样做之后&#xff0c;任何后续的npm install…

【二叉树】层序遍历

目录 层序遍历概念&结构 层序遍历的实现 整体思路 代码实现 图示理解 BT升级 整体思路 代码实现 图示理解​ 应用 题目 前序&中序&后序遍历&#xff1a;深度优先遍历dfs 层序遍历&#xff1a;广度优先遍历bfs 层序遍历概念&结构 层序遍历&#xf…

【java语言基础⑥】面向对象——面向对象的思想、类与对象

1.学习目标 了解面向对象的思想&#xff0c;能够说出面向对象的三个特性掌握类的定义&#xff0c;能够独立完成类的定义掌握对象的创建和使用&#xff0c;能够完成对象创建&#xff0c;用对象访问对象属性和方法掌握对象的引用传递&#xff0c;能够独立实现对象的引用传递熟悉…

力扣_字符串6—最小覆盖字串

题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 示例 &#xff1a; 输入&#xff1a;s “ADOBECODEBANC”, t “ABC” 输出&#xff1a;“BANC” 解释&#xff1a;…

Java安全 URLDNS链分析

Java安全 URLDNS链分析 什么是URLDNS链URLDNS链分析调用链路HashMap类分析URL类分析 exp编写思路整理初步expexp改进最终exp 什么是URLDNS链 URLDNS链是Java安全中比较简单的一条利用链&#xff0c;无需使用任何第三方库&#xff0c;全依靠Java内置的一些类实现&#xff0c;但…

mxxWechatBot主动发送消息至微信

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 免责声明&#xff1a;该工具仅供学习使用&#xff0c;禁止使用该工具从事违法活动&#xff0c;否则永久拉黑封禁账号&#xff01;&#xff01;&#xff01;本人不对任何工具的使用负责&am…

【Git版本控制 05】多人协作

目录 一、邀请开发用户 二、新建远程分支 三、拉取远程分支 四、推送远程分支 五、合并远程分支 六、多分支协作 一、邀请开发用户 在windows环境下&#xff0c;再clone同⼀个项⽬仓库&#xff0c;来模拟⼀起协作开发的另⼀名⼩伙伴。 际开发中&#xff0c;每个⽤⼾都有…

【Web】超级详细的Linux权限提升一站式笔记

目录 一、Linux内核提权 提权原理 提权环境 提权复现 二、SUID提权 SUID介绍 设置SUID SUID提权原理 查找SUID文件 提权介绍 find提权 bash提权 vim提权 python提权 三、计划任务提权 提权原理 提权环境 提权步骤 四、环境变量劫持提权 提权原理 提权环境…

【机器学习】卷积和反向传播

一、说明 自从 AlexNet 在 2012 年赢得 ImageNet 竞赛以来&#xff0c;卷积神经网络 (CNN) 就变得无处不在。从不起眼的 LeNet 到 ResNets 再到 DenseNets&#xff0c;CNN 无处不在。 您是否想知道 CNN 的反向传播中会发生什么&#xff0c;特别是反向传播在 CNN 中的工作原理。…

【知识整理】技术新人的培养计划

一、培养计划落地实操 1. 概要 新人入职&#xff0c;要给予适当的指导&#xff0c;目标&#xff1a; 1、熟悉当前环境&#xff1a; 生活环境&#xff1a;吃饭、交通、住宿、娱乐 工作环境&#xff1a;使用的工具&#xff0c;Mac、maven、git、idea 等 2、熟悉并掌握工作技…

Android---Jetpack Compose学习003

Compose 状态。本文将探索如何在使用 Jetpack Compose 时使用和考虑状态&#xff0c;为此&#xff0c;我们需要构建一个 TODO 应用&#xff0c;我们将构建一个有状态界面&#xff0c;其中会显示可修改的互动式 TODO 列表。 状态的定义。在科学技术中&#xff0c;指物质系统所处…

【C深度解剖】前置++与后置++

简介&#xff1a;本系列博客为C深度解剖系列内容&#xff0c;以某个点为中心进行相关详细拓展 适宜人群&#xff1a;已大体了解C语法同学 作者留言&#xff1a;本博客相关内容如需转载请注明出处&#xff0c;本人学疏才浅&#xff0c;难免存在些许错误&#xff0c;望留言指正 作…

相机图像质量研究(12)常见问题总结:光学结构对成像的影响--炫光

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

关于Navicat导入sql文件后er图乱序问题

关于Navicat导入sql文件后er图乱序问题 具体操作如下&#xff1a; 点击左下角刷新旁边的小三角

涤生大数据实战:基于Flink+ODPS历史累计计算项目分析与优化(上)

涤生大数据实战&#xff1a;基于FlinkODPS历史累计计算项目分析与优化&#xff08;一&#xff09; 1.前置知识 ODPS&#xff08;Open Data Platform and Service&#xff09;是阿里云自研的一体化大数据计算平台和数据仓库产品&#xff0c;在集团内部离线作为离线数据处理和存…

数据结构(3) 顺序表存储结构

顺序表存储结构 存储结构顺序结构定义基本操作的实现静态分配问题 动态分配代码功能 顺序表的特点: 顺序表小结顺序表的插入删除插入删除小结 顺序表的查找按位查找按值查找小结 各位小伙伴想要博客相关资料的话关注公众号&#xff1a;chuanyeTry即可领取相关资料&#xff01; …

Codeforces Round 924 E. Modular Sequence

E. Modular Sequence 题意 对于一个长度为 n n n 的数组 a a a&#xff0c;定义它是 g o o d good good 的当且仅当&#xff1a; a 1 x a_1 x a1​x a i a i − 1 y a_{i} a_{i - 1} y ai​ai−1​y 或 a i a i − 1 m o d y i ≥ 2 a_{i} a_{i - 1} mod \hspace{…

【Linux】内核中的链表

&#x1f525;博客主页&#xff1a;PannLZ &#x1f38b;系列专栏&#xff1a;《Linux系统之路》 &#x1f94a;不要让自己再留有遗憾&#xff0c;加油吧&#xff01; 文章目录 链表1.创建和初始化2.创建节点3.添加节点4.删除节点5.遍历 链表 内核开发者只实现了循环双链表&am…