码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • makefile中%、$@、$<、$^的作用


    目录

    %

    示例

    头文件fun.h

    main.cpp

    fun.cpp

    makefile

    $@与$<

    $^

    %

    %是通配符。https://www.quora.com/What-does-o-cpp-in-a-Makefile-mean是这样描述%的作用的:

     for every target X.o, if there exists a file named X.cpp, do the following

    对于任何一个.o文件,假如存在同名的.cpp文件,做如下操作。

    注意,不是根据任何一个cpp文件来找.o文件。makefile的工作流程是从最终的产物(可执行文件或so文件等)开始,寻找“上一级”产生它们的文件,直到最顶端的源代码。:

    可执行文件->.o文件->cpp文件/h文件。

    正因为这样,makefile才会根据.o文件查找同名.cpp文件,而不是反过来。

    示例

    看下面的示例:

    头文件fun.h

    int fun();

    main.cpp

    1. #include
    2. #include "fun.h"
    3. int main(void)
    4. {
    5. int i = fun();
    6. printf("i = %d\n", i);
    7. return 0;
    8. }

    fun.cpp

    1. #include "fun.h"
    2. int fun(){
    3. return 9;
    4. }

    makefile

    1. CC=gcc
    2. %.o: %.cpp
    3. $(CC) -c -o $@ $<
    4. main: main.o fun.o
    5. $(CC) -o main main.o fun.o

     make之后打印了三行语句:

    gcc -c -o main.o main.cpp

    gcc -c -o fun.o fun.cpp

    gcc -o main main.o fun.o

    前两句是由makefile的%.o: %.cpp  gcc -c -o $@ $<  规则展开 。对号入座就能看出,第一次使用%.o时,main字符串代入%。第二次代入使用fun字符串代入%。

    $@与$<

    将上面的打印结果与%.o: %.cpp  gcc -c -o $@ $<  规则对号入座,不难看出,$@对应%.o;而$<对应%.cpp

    https://unix.stackexchange.com/questions/116547/what-do-and-in-a-makefile-mean#:~:text=From%20make%20manpage%3A,rule's%20recipe%20to%20be%20run.解释了$@和$<的意义:

     $@是目标的名字(目标就是冒号":"左边的文件名)。假如冒号左边有不止一个目标,那么$@等于触发当前规则的那个目标。

    $<是第一个依赖项(依赖项就是冒号":"右边的文件名)。

    再看下面关于$@的例子

      

    这个例子说明,当冒号“:”左边有多个目标时,$@一次只会对应一个目标。

    另外,all:a.o b.o这句不能省略。省略的话,makefile只会按照生成a.o的规则执行一次。

    $^

     上面的例子可以进一步抽象,将makefile改写为如下:

    1. CC=gcc
    2. %.o: %.cpp
    3. $(CC) -c -o $@ $<
    4. main: main.o fun.o
    5. $(CC) -o $@ $^

    注意最后一行。$@取代了main,因为$@就代表main。$^取代了main.o fun.o。因为$^的作用就是代替冒号":"右边的所有依赖项(prerequisites)

  • 相关阅读:
    后端微服务项目中出现的问题整理2022年11月
    Activiti7笔记
    QT day1
    阿里云ACP认证考试易错题集
    智能家居如何融合人工智能技术
    [springboot专栏]RedisLockRegistry实现分布式锁
    败给 VS Code,GitHub 被微软收购的第四年,“杀死”了代码编辑器 Atom
    【Tools】Notepad++官网下载
    LeetCode 643. Maximum Average Subarray I
    《警世贤文》摘抄:处人篇、受恩篇、宽人篇、听劝篇、劝善篇(多读书、多看报、少吃零食多睡觉)
  • 原文地址:https://blog.csdn.net/liji_digital/article/details/127425862
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号