热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

makefile之目录搜索&自动依赖

目录搜索在一个大工程中,一般会将源文件和中间生成文件放在不同的目录,而且不会污染源码所在的目录。当需要编译不同目录下的源文件时,就需要指定路径,那么怎样让路径的表示以及源文件的引用

目录搜索

在一个大工程中,一般会将源文件和中间生成文件放在不同的目录,而且不会污染源码所在的目录。当需要编译不同目录下的源文件时,就需要指定路径,那么怎样让路径的表示以及源文件的引用更加灵活。就要用到目录搜索功能。


VPATH

VPATH:指定依赖文件的搜索目录,当规则的依赖文件在当前目录不存在时,make会在此变量所指定目录下去寻找这些依赖文件。

#VPATH = src
all: VPATH.o
@echo compile done
%.o: %.c
gcc -c $<-o $@

1536619511612

1536619511612.png

依赖文件通常你可以指定全路径,那么执行make时能找到依赖文件,就会编译出对应的目标文件。但是在一个大工程中,源码的目录结构复杂,每个依赖文件都带上绝对路径,makefile看起来会非常繁琐。上面给出的例子中,只有一个依赖文件,或许你可以这样写all: src/VPATH.o, 但是当依赖文件变多,目录结构变复杂,或者需要更改目录结构时,makefile文件的改动很大。但是如果使用VPATH指定搜索目录,那么只需要关注依赖文件的文件名,然后在VPATH中指定搜索路径即可。


vpath

vpath: make的一个关键字,和VPATH的功能类似,都是指定依赖文件的搜索目录。

使用的三种方法:

vpath PATTERN DIRECTORIES

为所有符合PATTERN的文件指定搜索目录DIRECTORIES.多个目录使用空格或冒号(:)分开

vpath PATTERN

清除之前 符合 PATTERN 的文件设置路径 

vpath

清除所有的已被设置的文件搜索路径

#为.c文件指定搜索目录
vpath %.c src
all: vpath.o
@echo compile done
%.o: %.c
gcc -c $<-o $@

#为.c文件指定搜索目录
vpath %.c src
#为.h文件指定搜索目录
vpath %.h include
all: vpath.o
@echo compile done
%.o: %.c
gcc -MD -I include -c $<-o $@
clean:
rm *.o *.d

makefile vpath 中出现的.h文件,仅限于在makefile中有效。对于源文件#include的头文件仍需要使用-I + directory 指定搜索目录。

如果上例子中,将 -I include 去掉,那么make会报“src/vpath.c:2:19: fatal error: vpath.h: No such file or directory”的错误。


自动生成依赖关系

-MD 自动生成目标文件的依赖关系,并保存在*.d文件中。

#为.c文件指定搜索目录
vpath %.c src
#为.h文件指定搜索目录
vpath %.h include
all: vpath.o
@echo compile done
%.o: %.c
#gcc -MD -c $<-o $@
gcc -MD -I include -c $<-o $@
clean:
rm *.o *.d

修改src/vpath.c前,该源文件是#include "vpath.h"的。生成的vpath.d的内容是:vpath.o: src/vpath.c /usr/include/stdc-predef.h include/vpath.h

修改src/vpath.c后,即将源文件中的#include "vpath.h"注释掉。生成的vpath.d的内容是:vpath.o: src/vpath.c /usr/include/stdc-predef.h

显然少了 include/vpath.h.那使用-MD有什么作用呢。

试想,当在源文件中加入或者删除头文件时,如果不使用MD自动生成依赖关系,就需要手动的修改makefile中显示的依赖关系,显然这是一种低效的方式且容易出错。

gcc 的 "-MD"选项将自动寻找源文件中include的头文件,并生成文件的依赖关系,保存在*.d文件中。

incdirs := include include/src2
srcdirs := src src2
#指定源文件列表(由vpath处理路径问题)
srcs := vpath.c src2.c
#指定中间文件目录
objdir := obj
#指定目标文件列表
objlist := $(patsubst %.c, $(objdir)/%.o, $(srcs))
#指定gcc头文件路径
INCDIR := $(patsubst %, -I%, $(incdirs))
#为.c文件指定搜索目录
vpath %.c $(srcdirs)
#为.h文件指定搜索目录
vpath %.h $(incdirs)
.PHONY: all clean
objdir:
@echo "create obj directory"
-mkdir $(objdir)
$(objdir)/%.o: %.c
gcc -MD $(INCDIR) -c $<-o $@
all: $(objdir) $(objlist)
@echo compile done
clean:
rm $(objdir)/*.o $(objdir)/*.d $(objdir) -rf


推荐阅读
  • 个人博客https:juejin.cnuser176366088104638和http:blog.wuzhenyu.com.cncmake编译动态库和链接动态库cmake中&#x ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • [转]Makefile 使用总结
    2019独角兽企业重金招聘Python工程师标准1.Makefile简介Makefile是和make命令一起配合使用的.很多大型项目的编译都是通过Makefile来组织的,如 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 深入分析 Linux 内核链表转
    引用地址:http:www.ibm.comdeveloperworkscnlinuxkernell-chainindex.html一、链表数据结构简介链表是一种常用的 ... [详细]
  • Linux下Google Test (GTest)测试环境搭建步骤
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 求助高手:下载的压缩包中包含CMake文件,如何在Windows环境下使用已安装的CMake GUI进行运行?
    从GitHub仓库 `https://github.com/vonmax007/RobotSimulation` 下载的代码包含多种算法,其中算法1的文件目录中包含了CMake文件。为了在Windows环境下使用已安装的CMake GUI运行这些文件,需要先确保CMake已正确安装,并按照以下步骤操作:打开CMake GUI,设置源代码路径和构建路径,点击“Configure”配置项目,然后点击“Generate”生成构建文件。最后,在生成的构建目录中使用命令行或IDE进行编译和运行。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • 如何在Linux环境中高效地创建、编译与运行C语言代码
    本文面向第一次在linux尝试写C语言程序的新人。有经验的请绕行。C语言用法不是本文介绍的关键,本文只是引入如何第一次在linux系统下编写、编译和执行一个简单的c程序。学会后请自行深入 ... [详细]
  • 编写程序可以用vi编辑器vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和 ... [详细]
  • 如何判断电容好坏?
    关注+星标公众号,不错过精彩内容来源 | 电子电路怎样测量小容量电容的好坏?1、检测10pF以下的小电容,因10pF以下的固定电容器容量太小,如果用指针式用万用表进行测量,只能定性 ... [详细]
author-avatar
万花_筒乙姬睦美
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有