makefile中关于all和.PHONY .cpp.o

2023-10-30

转自:http://blog.163.com/benben_long/blog/static/199458243201110230292490/

http://blog.csdn.net/wangxmin2005/article/details/8082409

请编写一个makefile同时编译、链接下面两个程序:

main1.c:

#include<stdio.h>

int main(void)

{

    printf("main1\n");

}

main2.c:

#include<stdio.h>

int main(void)

{

    printf("main2\n");

}

【分析】:这里需要生成两个可执行文件main1main2(两个目标)。由于makefile只能有一个目标,所以可以构造一个没有规则的终极目标all,并以这两个可执行文件作为依赖。如下:

makefile:

all:main1 main2

main1: main1.c

    @gcc main1.c -o main1

main2: main2.c

    @gcc main2.c -o main2

很多时候我们在执行make时会产生许多过程文件,比如将上面的makefile改为:

makefile:

all:main1 main2

main1: main1.c

    @gcc main1.c -o main1

main2: main2.o

    @gcc main2.o -o main2

main2.o: main2.c

    @gcc -c main2.c 

这样就会生成一个我们不需要的过程文件main2.o

如果希望将生成的过程文件删掉,根据前面再增加一个目标clean

all:main1 main2 clean

main1: main1.c

    @gcc main1.c -o main1

main2: main2.o

    @gcc main2.o -o main2

main2.o: main2.c

    @gcc -c main2.c 

clean:

    @rm -f main2.o

但是当我们make之后main2.o仍然存在,怎么回事呢makefile中的all和.PHONY的作用

原来这里的目标clean没有任何依赖,make执行时认为这已经到“根上”了(就是认为磁盘上有clean,就像main2.c,将其忽略(尽管它有规则)。

关键字.PHONY可以解决这问题,告诉make该目标是“假的”(磁盘上其实没有clean),这时make为生成这个目标就会将其规则执行一次。.PHONY修饰的目标就是只有规则没有依赖。

加上一句.PHONY:clean即可:

all:main1 main2 clean

main1: main1.c

    @gcc main1.c -o main1

main2: main2.o

    @gcc main2.o -o main2

main2.o: main2.c

    @gcc -c main2.c 

.PHONY:clean

clean:

    @rm -f main2.o

 

【附】

phony ['f?uni] a. 假的

GNU的make能够使整个软件工程的编译、链接只需要一个命令就可以完成。

makefile的术语:

规则:用于说明如何生成一个或多个目标文件

规则的格式:

targetsprerequisites

    command

目标: 依赖

    命令

+++++命令需要以[TAB]键开始++++


补充:

.cpp.o:

    $(CC) $(INCLUDE) $(CFLAGS) -c $<

这里.cpp.o是老式的“后缀规则”,编译器将会自动将.cpp识别为源文件后缀,而.o识别为输出文件后缀。特别需要注意的是,后缀规则不允许任何依赖文件,但也不能没有命令。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

makefile中关于all和.PHONY .cpp.o 的相关文章

  • 错误解决:Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255]

    今天又是快乐改错误的经历 在做k means进行图片压缩的实战项目中 我遇到了这样一个pyplot显示图像报错问题 Clipping input data to the valid range for imshow with RGB dat
  • Python中的字典用法

    文章目录 一 字典的定义 二 字典的创建 2 1 一个简单的字典 2 2 字典的嵌套 三 字典的特性 3 1 字典不支持切片 3 2 成员操作符 3 3 for循环遍历 四 字典元素的增加 五 字典元素的删除 六 字典元素的查看 七 字典的
  • 制作最简单的Git Server

    网上看到的Git Server部署方法一大堆 一会儿搞什么SSH 还要弄私钥公钥 复杂无比 其实有一个办法非常简单 如果是在公司内网环境下 需要将某台机器部署为Git Server 我们称该机器为服务器 假设IP为192 168 0 111
  • uni-app前端用户登录实现

    从0开始开发SpringBoot vue前后端分离项目 后端 Springboot简单实现用户登录操作 文章目录 从0开始开发SpringBoot vue前后端分离项目 后端 1 HBuildX uni app创建项目 一 项目目录结构 二
  • LinearLayer

    线性层的作用 类似于这边荧光绿的两层 就是fully connected layer 将1 1 4096的向量 变成1 1 1000的向量 代码示例 import torch import torchvision from torch im
  • dwr 使用 callback 多个参数(间接方法)

    dwrInvokeDataClaimAction findSupplierByName payee callback function returnData bringOutSupplierCallback returnData arg1
  • 【Redis】List类型和底层原理

    文章目录 List类型 1 List介绍 1 1常用命令 2 List底层实现 3 ziplist剖析 3 1ziplist结构 3 2创建一个空的ziplist 3 3ziplist的元素节点结构 3 4ziplisqt的连锁更新 3 5
  • Java 集合(List与LinkedList)接口详解

    List接口 List接口的定义 List interface List extends Collection 通过观察List接口的定义发现其继承得是Collection接口 List Set Queue接口继承的都是Collection
  • [持续开源中]用2000元左右做水下机器人

    1 水下机器人功能 1 平稳的运动控制 2 高清视频 3 定深悬停 巡航 2 相关技术 2 1 PC上位机 1 C Winform MVC 现有 2 C MAUI MVVM Socket 开发中 2 2 下位机 水下机器人 2 2 1 So

随机推荐

  • 最长连续子序列的起始位置

    用结构体保存结果 注意的是最长连续子序列需要的是连续 所以dp的状态方程别写错了 include
  • inotify_init使用

    用于监控文件 目录的修改创建删除等操作 也可以配合epoll使用 include
  • Upload-Labs-Windows Pass-01

    题目 解题 步骤1 上传文件 上传一句话木马 编辑文件a php 内容为 直接上传的话 会提示错误 题目要求选择图片格式上传 文件名改为a jpg 内容为 然后通过burp suite来修改上传文件名字 步骤2 改文件名 把a jpg改为a
  • 组件库技术选型总结

    Monorepo Multirepo 架构 Multirepo指的是将模块分为多个仓库 每个团队都拥有自己的仓库 他们可以使用自己的构建流程 代码规范等 但是同时也会存在很多问题 比如模块中间如果存在相互依赖 就必须到目标仓库里进行bug修
  • android动态权限的源码解析

    android 动态权限 android权限的类型 在android9 0中定义了很多权限 如下
  • LeetCode-七进制数、最小高度二叉搜索树

    只是为了记录每天的练习 要好好加油啊呜呜呜现在的我还太拉了 思路很直接啊 就是转进制 数字转字符串 class Solution public string convertToBase7 int num if num 0 特殊情况 retu
  • HelloSpring---第一个spring项目

    1 Spring概述 1 1 简介 Spring 春天 gt 给软件行业带来了春天 2002年 Rod Jahnson首次推出了Spring框架雏形interface21框架 2004年3月24日 Spring框架以interface21框
  • websocket php连接数,swoole websocket协程服务端 因为客户端连接数量过多崩溃

    问题描述 websocket 携程风格的服务端 同时300多个客户端连接的时候 PHP Fatal error Uncaught Error Maximum function nesting level of 256 reached abo
  • ARM汇编多寄存器寻址

    原文转自 http hi baidu com mugua item c43f37cc55a75d35ee4665e6 多寄存器和堆栈寻址的用法 多寄存器寻址 LDMIA LDMIB STMIA STMIB LDMDA LDMDB STMDA
  • 使用Python实现公司地址的(3-4级)标准化

    这个博客的目的是实现公司地址的模糊匹配与3 4级标准化 也可以迁移到房产信息 电话号码之类的字段上 本来的应用场景是反团伙欺诈以及失联客户的修复 大概的意思就是说多个相同公司的同事都在我公司借贷的欺诈可能性要高于其他客户 以及造假的房产信息
  • linux安装百度云盘

    之前window下一直使用绿色 你懂的 的百度云 但时切换到Ubuntu 系统之后 要下载好几个G的百度云资源却没有Linux版的客户端 网上又说使用bcloud 但是在16 04环境安装后总是登录不上 索性直接找了个浏览器插件下载 用起来
  • 股票API下单接口是怎样传入交易数据的?

    股票API下单接口传入交易数据的方法有四种 但主要使用的还是csvdatasetconfig和函数 不过基于当前的线程组或者请求创建CSV数据文件配置组件 如果这份数据只有这一个请求会用 那么就基于请求创建即可 如果这份数据会被这个线程组里
  • IDEA 快捷键等小技巧积累

    快捷键 全局搜索 Ctrl N 利用类名查找类文件 查看类继承关系 Ctrl H 查询某个符号被使用的所有地方 Alt F7 其他 自动导包 代码模板 code template
  • 【node.js】 Windows 下更新 node.js

    文章目录 一 node js 更新 一 查询 node js 版本 二 查询 node js 安装位置 三 官网下载安装包 四 安装到原位置 覆盖旧版本 二 npm 更新 一 查看版本 二 更新版本 三 yarn 更新 一 查看版本 二 更
  • (六)Java操作elasticSearch(2)

    Java操作elasticSearch 2 一 DSL查询文档 0 DSL 1 DSL查询分类 2 全文检索查询 3 精准查询 4 地理坐标查询 5 组合查询 二 搜索结果的处理 0 搜索结果处理整体语法 1 排序 2 分页 3 高亮 三
  • VMware Fusion 挂载物理机硬盘(整盘)

    以下操作前提 系统为 Mac OS OSX 安装了 VMware Fusion 实现原理 类似ESXI中的RDM映射 将物理硬盘映射到一个VM虚拟磁盘 可供VM选择的虚拟磁盘文件 首先查询本机硬盘情况 diskutil list 采用SCS
  • S50非接触式IC卡性能简介(M1)

    主要指标 容量为8K位EEPROM 分为16个扇区 每个扇区为4块 每块16个字节 以块为存取单位 每个扇区有独立的一组密码及访问控制 每张卡有唯一序列号 为32位 具有防冲突机制 支持多卡操作 无电源 自带天线 内含加密控制逻辑和通讯逻辑
  • chatgpt赋能python:Python主动抛出异常详解:了解如何正确地处理异常

    Python主动抛出异常详解 了解如何正确地处理异常 在Python开发中 异常处理是非常重要的一部分 可以使我们的程序更加健壮和可靠 然而并不是所有的错误都是由Python解释器捕获的 我们有时需要手动抛出异常 在本文中 我们将介绍Pyt
  • MPU6050 获取角度理论推导(二)---6轴融合算法

    接着上篇文章 https mp csdn net postedit 101777018 姿态角解算 互补滤波算法及理论推导 一般在程序中 姿态解算的方式有两种 一种是欧拉角法 一种是四元数法 这里不介绍欧拉角法 只介绍四元数法 互补滤波算法
  • makefile中关于all和.PHONY .cpp.o

    转自 http blog 163 com benben long blog static 199458243201110230292490 http blog csdn net wangxmin2005 article details 80