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

MAKEFILE详解多目标静态模式十三

转自http:www.cppblog.comivenherarticles22097.html读后小结:1.subst函数--字符串替换2.$--目标的集合,依

转自 http://www.cppblog.com/ivenher/articles/22097.html

读后小结:

1. subst函数 -- 字符串替换

2. $@  -- 目标的集合,依次取出

3. $<   -- 依赖的集合&#xff0c;依次取出

4. 静态模式定义多目标

   

            

5. $(filter ,) -- 模式过滤字符串中的单词&#xff0c;保留符合模式的单词




MAKEFILE详解 多目标 静态模式 十三


六、多目标 

Makefile的规则中的目标可以不止一个&#xff0c;其支持多目标&#xff0c;有可能我们的多个目标同时依赖于一个文件&#xff0c;并且其生成的命令大体类似。于是我们就能把其合并起来。当然&#xff0c;多个目标的生成规则的执行命令是同一个&#xff0c;这可能会可我们带来麻烦&#xff0c;不过好在我们的可以使用一个自动化变量“$&#64;”&#xff08;关于自动化变量&#xff0c;将在后面讲述&#xff09;&#xff0c;这个变量表示着目前规则中所有的目标的集合&#xff0c;这样说可能很抽象&#xff0c;还是看一个例子吧。 

    bigoutput littleoutput : text.g 
            generate text.g -$(subst output,,$&#64;) >; $&#64; 

    上述规则等价于&#xff1a; 

    bigoutput : text.g 
            generate text.g -big >; bigoutput 
    littleoutput : text.g 
            generate text.g -little >; littleoutput 

    其中&#xff0c;-$(subst output,,$&#64;)中的“$”表示执行一个Makefile的函数&#xff0c;函数名为subst&#xff0c;后面的为参数。关于函数&#xff0c;将在后面讲述。这里的这个函数是截取字符串的意思&#xff0c;“$&#64;”表示目标的集合&#xff0c;就像一个数组&#xff0c;“$&#64;”依次取出目标&#xff0c;并执于命令。 
   &#xff08;注&#xff1a;make中函数subst&#xff0c; $(subst FROM, TO, TEXT)&#xff0c;即将字符串TEXT中的子串FROM变为TO。&#xff09;

七、静态模式 

静态模式可以更加容易地定义多目标的规则&#xff0c;可以让我们的规则变得更加的有弹性和灵活。我们还是先来看一下语法&#xff1a; 

    ;: ;: 
            
            ... 


    targets定义了一系列的目标文件&#xff0c;可以有通配符。是目标的一个集合。 

    target-parrtern是指明了targets的模式&#xff0c;也就是的目标集模式。 

    prereq-parrterns是目标的依赖模式&#xff0c;它对target-parrtern形成的模式再进行一次依赖目标的定义。 

这样描述这三个东西&#xff0c;可能还是没有说清楚&#xff0c;还是举个例子来说明一下吧。如果我们的;定义成“%.o”&#xff0c;意思是我们的;集合中都是以“.o”结尾的&#xff0c;而如果我们的;定义成“%.c”&#xff0c;意思是对;所形成的目标集进行二次定义&#xff0c;其计算方法是&#xff0c;取;模式中的“%”&#xff08;也就是去掉了[.o]这个结尾&#xff09;&#xff0c;并为其加上[.c]这个结尾&#xff0c;形成的新集合。 

所以&#xff0c;我们的“目标模式”或是“依赖模式”中都应该有“%”这个字符&#xff0c;如果你的文件名中有“%”那么你可以使用反斜杠“\”进行转义&#xff0c;来标明真实的“%”字符。 

看一个例子&#xff1a; 

    objects &#61; foo.o bar.o 

    all: $(objects) 

    $(objects): %.o: %.c 
            $(CC) -c $(CFLAGS) $< -o $&#64; 


上面的例子中&#xff0c;指明了我们的目标从$object中获取&#xff0c;“%.o”表明要所有以“.o”结尾的目标&#xff0c;也就是“foo.o bar.o”&#xff0c;也就是变量$object集合的模式&#xff0c;而依赖模式“%.c”则取模式“%.o”的“%”&#xff0c;也就是“foo bar”&#xff0c;并为其加下“.c”的后缀&#xff0c;于是&#xff0c;我们的依赖目标就是“foo.c bar.c”。而命令中的“$<”和“$&#64;”则是自动化变量&#xff0c;“$<”表示所有的依赖目标集&#xff08;也就是“foo.c bar.c”&#xff09;&#xff0c;“$&#64;”表示目标集&#xff08;也就是“foo.o bar.o”&#xff09;。于是&#xff0c;上面的规则展开后等价于下面的规则&#xff1a; 

    foo.o : foo.c 
            $(CC) -c $(CFLAGS) foo.c -o foo.o 
    bar.o : bar.c 
            $(CC) -c $(CFLAGS) bar.c -o bar.o 

试想&#xff0c;如果我们的“%.o”有几百个&#xff0c;那种我们只要用这种很简单的“静态模式规则”就可以写完一堆规则&#xff0c;实在是太有效率了。“静态模式规则”的用法很灵活&#xff0c;如果用得好&#xff0c;那会一个很强大的功能。再看一个例子&#xff1a; 


    files &#61; foo.elc bar.o lose.o 

    $(filter %.o,$(files)): %.o: %.c 
            $(CC) -c $(CFLAGS) $< -o $&#64; 
    $(filter %.elc,$(files)): %.elc: %.el 
            emacs -f batch-byte-compile $< 


$(filter %.o,$(files))表示调用Makefile的filter函数&#xff0c;过滤“$filter”集&#xff0c;只要其中模式为“%.o”的内容。其的它内容&#xff0c;我就不用多说了吧。这个例字展示了Makefile中更大的弹性。 




推荐阅读
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
  • 在VC环境中,掌握高效的调试技巧和高级应用对于提高开发效率至关重要。本文详细介绍了如何通过检查程序中的括号匹配来避免常见的语法错误。具体操作包括将光标置于待检测的括号(如大括号 {}、方括号 [] 和圆括号 ())上,系统会自动高亮显示对应的配对括号,从而帮助开发者快速定位和修复问题。此外,文章还探讨了其他实用的调试工具和方法,如断点设置、变量监视和调用堆栈分析,以全面提升代码调试的准确性和效率。 ... [详细]
  • 在探讨 AS3 中的数据深度复制技术时,本文详细介绍了实现数据深度克隆的有效方法。通过对比多种方案,最终确定了一种高效且可靠的实现方式,所有代码均来源于公开资源,确保了方法的实用性和可操作性。 ... [详细]
  • Qt 34:深入探讨缓冲区管理、目录操作及文件系统监控技术——QBuffer、QDir与QFileSystemWatcher的应用分析
    本文深入探讨了Qt框架中QBuffer、QDir和QFileSystemWatcher三个核心类的应用。QBuffer作为缓冲区管理工具,提供了高效的数据读写功能;QDir则专注于目录操作,支持路径遍历和文件检索等任务;而QFileSystemWatcher则用于实时监控文件系统的变化,便于应用程序及时响应文件或目录的增删改操作。通过实例分析,详细解析了这三个类在实际开发中的应用场景和实现细节。 ... [详细]
  • 如何在Android应用中设计和实现专业的启动欢迎界面(Splash Screen)
    在Android应用开发中,设计与实现一个专业的启动欢迎界面(Splash Screen)至关重要。尽管Android设计指南对使用Splash Screen的态度存在争议,但一个精心设计的启动界面不仅能提升用户体验,还能增强品牌识别度。本文将探讨如何在遵循最佳实践的同时,通过技术手段实现既美观又高效的启动欢迎界面,包括加载动画、过渡效果以及性能优化等方面。 ... [详细]
  • APKAnalyzer(1):命令行操作体验与功能解析
    在对apkChecker进行深入研究后,自然而然地关注到了Android Studio中的APK分析功能。将APK文件导入IDE中,系统会自动解析并展示其中各类文件的详细信息。官方文档提供了详细的命令行工具使用指南,帮助开发者快速上手。本文以一个RecyclerView的Adapter代理开源库为例,探讨了如何利用这些工具进行高效的APK分析。 ... [详细]
  • 深入解析Spring框架中的双亲委派机制突破方法
    在探讨Spring框架中突破双亲委派机制的方法之前,首先需要了解类加载器的基本概念。类加载器负责将类的全限定名转换为对应的二进制字节流。每个类在被特定的类加载器加载后,其唯一性得到保证。然而,这种机制在某些场景下可能会限制灵活性,因此Spring框架提供了一些策略来突破这一限制,以实现更加动态和灵活的类加载。这些策略不仅能够提升系统的可扩展性,还能在复杂的运行环境中确保类的正确加载和管理。 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 在实现将 PictureBox 中的图片保存到本地的功能时,遇到了两个主要问题。首先,`mypicture.Save(path)` 方法经常抛出“参数无效”的异常,但不清楚具体原因。其次,代码中可能存在其他潜在的问题需要解决。本文将探讨这些问题的可能原因,并提供相应的解决方案,以确保图片能够成功保存到指定路径。 ... [详细]
  • 深入解析Web.xml中Servlet与Filter的URL模式匹配机制 ... [详细]
author-avatar
手机用户2502887185
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有