Make file 不检测源文件中的更改

2023-12-13

我对 make 文件非常陌生,我面临着非常基本的问题,我的 Makefile 没有检测到我对源文件所做的更改。问题是,当我第一次从源文件生成 consoleapp 二进制文件时,我得到了预期的输出。但是当我再次更改源文件并再次运行 make 时,它​​会说

make:“consoleapp”是最新的,那么我必须进行哪些更改才能生成文件,以便它检测到我的更改

下面是我的 Makefile :

consoleapp: 
    g++  consoleapp.cpp  -o consoleapp

clean:
    rm -rf *.o  consoleapp

这是我的源文件:

#include <iostream>
using namespace std;

int main()
{
    cout<<"I am ok  \n";  // I am changing this line again after giving make
    
    return 0;
}

make依赖于 makefile 作者告诉它每个目标的先决条件是什么——也就是说,哪些其他目标或文件会影响相关目标的构造,因此,如果它们较新或本身已过时,则目标已过时并且应该重建。正如您的其他答案已经表明的那样,您没有为目标指定任何先决条件,因此make当且仅当它们根本不存在时才认为它们已经过时。

这实际上是有问题的both目标,尽管方式不同。对于目标consoleapp,它代表您想要构建的实际文件,如果未能指定任何先决条件,则会产生您询问的问题:make不认识到对源文件的更改需要重建。解决这个问题的最简单方法是将源文件名添加到配方的标题行的冒号后面:

consoleapp: consoleapp.cpp
        g++ consoleapp.cpp -o consoleapp

然而,一般来说,明智的做法是尽量减少 makefile 代码中的重复,为此,您可以使用一些make的自动变量,以避免在规则配方中重复目标和先决条件名称。我特别推荐always using $@在其配方中指定规则的目标:

consoleapp: consoleapp.cpp
        g++ consoleapp.cpp -o $@

对于先决条件来说,这更具情境性。在这种情况下,所有的必备条件都是要编译的源文件,而且只有一个。如果您愿意依赖 GNU 扩展,那么在配方中您可以通过以下任一方式表示源$<(这代表first先决条件),或作为$^(它代表整个先决条件列表,删除了所有重复项)。例如,

consoleapp: consoleapp.cpp
        g++ $^ -o $@

如果您不使用 GNUmake但是,或者如果您想支持其他不支持的人,那么您就必须在这里进行一些重复。您仍然可以节省一些精力,特别是在源列表发生更改的情况下,通过创建make源的变量并复制该变量,而不是复制源列表本身:

consoleapp_SRCS = consoleapp.cpp

consoleapp: $(consoleapp_SRCS)
        g++ $(consoleapp_SRCS) -o $@

我之前提到过,存在以下问题both你的规则。但可能有什么问题clean规则,你可能会问?它不会创建名为“clean”的文件,因此每次执行时都会运行其配方make clean,如你所愿,对吧?不必要。虽然那条规则不会创建名为“clean”的文件,如果这样的文件是通过其他方式创建的,那么突然您的clean规则将停止工作,因为将发现该文件就其(空)先决条件列表而言已经是最新的。

POSIX标准make没有解决方案,但 GNUmake为其提供特殊目标.PHONY。对于 GNU make,指定为先决条件的任何目标.PHONY总是被认为是过时的,并且文件系统甚至不会检查它们。这正是为了支持诸如clean,用于指定要执行的操作,这些操作不会在文件系统上产生持久工件。虽然这是一个 GNU 扩展,但它是可移植的,因为它使用标准make语法和目标的形式是为扩展保留的,所以make不支持.PHONY在 GNU 意义上,很可能要么忽略它,要么将其视为普通规则:

.PHONY: clean

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

Make file 不检测源文件中的更改 的相关文章

随机推荐

  • 将 stargazer 与 Zelig 结合使用

    我正在尝试使用 stargazer 版本 5 2 输出使用 Zelig 版本 5 0 13 估计的回归的标准摘要 结果 但是 我得到了错误 Error in envRefInferField x what getClass class x
  • 无法在 python 上找到图像

    我尝试在屏幕上找到图像 但它总是表明这一点 Traceback most recent call last File C Users MerazulIslam Desktop ZOOM BOT bot py line 20 in
  • 计算mysql中最后一行的总持续时间

    我有这个 mysql 查询 SELECT CONCAT u lastname u firstname AS Name start timestamp start end timestamp end timediff end timestam
  • 使用 matplotlib 在 Tkinter 中绘制数据 - 在列表之间切换

    我正在创建一个程序 利用Tkinter and matplotlib 我有 2 个列表列表 一个用于 x 轴 一个用于 y 轴 我希望有一个可以在列表中的列表之间切换的按钮 我从问题中获取了大部分代码基于Tkinter和matplotlib
  • 检测本地和远程之间不同步的所有标签

    有没有一种简单的方法可以确定本地存储库中哪些标签与远程不同步 不同步是指完全相同的标签名称指向本地与远程上的不同提交 我能想到的两种导致这种情况的方法可能是 有人 或某物 移动了我之前获取的标签 也许它被删除并重新创建 或者它是在它已经存在
  • 将 Java 代码与烘焙到 .jar 中的数据一起传送

    我需要发送一些具有关联数据集的 Java 代码 它是一个设备模拟器 我希望能够将用于模拟记录的所有数据包含在一个 JAR 文件中 在这种情况下 每个模拟记录包含四个字段 主叫方 被叫方 呼叫开始 呼叫持续时间 最好的方法是什么 我已经沿着以
  • 比较 ReadOnlyMemory 实例的最佳方法?

    The ReadOnlyMemory
  • 显示/隐藏 div,使用纯 JS

    My CSS a x200 visibility hidden width 200px height 200px background color black My JS 我的HTML div asd div
  • 如何将像素转换为 xamarin.forms 单位?

    每英寸有 160 个单位 2 如果我创建了一个Photoshop文件为 72dpi那么每英寸就有 72 个点 3 如果元素是88px身高在Photoshop那么我必须将其设置为xamarin 如果手机是 360dpi 那么 xamarin
  • 将双精度型转换为整型?

    我的代码如下 int main int argc char argv double f 18 40 printf d n int 10 f return 0 在VC6 0中结果是184 而Codeblock中结果是183 为什么呢 原因是
  • Symfony 任务 - 内存泄漏

    我编写了一个 symfony 任务来填充示例数据的数据库 这是一段示例代码 gc enable Propel disableInstancePooling public function test for i 0 i lt 10000 i
  • 保持绘制图形 - 删除 super.paintComponent

    我有一个名为 Foo 的类 它扩展了一个名为 Bar 的类 该类扩展了 JPanel 并实现了 ActionListener 当我选择圆形并单击绘制按钮时 我会绘制一个圆形 而当我按矩形并单击绘制时 它会擦除 以前的形状并绘制一个矩形 但是
  • osmdroid 经典标记重叠的解决方法

    我正在使用 osmdroid 和 osm Bonus Pack 开发 Android 离线地图应用程序 并从外部存储加载图块和数据 现在 随着数据的增长 标记开始变得拥挤在一起 我什至有同一建筑物上两个地方的情况 我知道这种问题以前已经被问
  • 范围报告:无法在其他机器上看到屏幕截图

    我可以在本地计算机上生成带有屏幕截图的范围报告 但是 当我将报告邮寄给其他人 或在不同的计算机上打开 html 时 屏幕截图不可见 它说该路径无效 在附加屏幕截图时 我给出了本地计算机的路径 它也在其他机器上搜索相同的路径 我也尝试将 ht
  • 在 Python 中使用 Twain 模块

    我有 64 位 Windows 和 64 位 Python 在里面吐温文档说 只支持32位 我用过吐温数据源安装我的 64 位机器并使用此代码连接扫描仪设备 import twain sm twain SourceManager 0 ss
  • 如何在 UWP 中使用 3 级语义缩放?

    我想使用语义缩放 或其效果 在我的 UWP 应用程序中选择位置 我想首先选择县 第二选择城市 第三选择位置 有人对此有真实的想法吗 我搜索了多个缩放以进行语义缩放 但这显然是不可能的 我使用了两个语义缩放视差 但这也有其问题 有人可以帮忙吗
  • Neo4j 中跨多个字段的全文搜索示例?

    我见过一些简单的文本搜索示例STARTS WITH name例如 http www jexp de blog html full text and spatial search in neo4j 3 html https blog knol
  • 为什么验证规则的行为(仅)与 onDisconnect 更新不同?

    我用 firebase 做了一些测试 发现规则验证之间存在差异onDisconnect update 和简单的update using newData parent 在规则中 当我使用update 有用 但与onDisonnect upda
  • Python 列表的 += 运算符等同于append() 或extend() 吗? [复制]

    这个问题在这里已经有答案了 Python 列表有一个 运算符以及append and extend方法 If l是一个列表 是l 相当于l append l extend 两者都存在 还是两者都不存在 在 python 中 列表上的 相当于
  • Make file 不检测源文件中的更改

    我对 make 文件非常陌生 我面临着非常基本的问题 我的 Makefile 没有检测到我对源文件所做的更改 问题是 当我第一次从源文件生成 consoleapp 二进制文件时 我得到了预期的输出 但是当我再次更改源文件并再次运行 make