如何确保我的 makefile 检测到头文件和 cpp 文件中的更改?

2023-12-15

目前,每当我这样做时make我的 makefile 告诉我

make: `some/obj/file.o' 是最新的。

无论我是否编辑了生成该目标文件所涉及的任何文件。我如何让它检测变化?这是一个重现该问题的简单 makefile:

SHELL := /bin/bash
src := src
sources := $(shell find $(srcDir) -name "*.cpp")                                
objects := $(sources:%.cpp=%.o)                                                 

-include $(sources:%.cpp=%.d)                                                   

all: prog                                                                       

prog:   $(objects)                                                              
    g++ $(objects) -o /a.out                                                    

%.o: %.cpp                                                                      
    $(CXX) $(CXXFLAGS) -MMD -MP -c $< -I $(srcDir) -o $@                        

clean:                                                                          
    find $(srcDir) -type f -iname "*.o" -delete                                 
    find $(srcDir) -type f -iname "*.d" -delete 

目前我必须跑make clean每次都要重新编译,这显然不理想!

编辑:这是我根据 Chnossos 的回答所做的尝试:

EXE := a.out                                                                    
SRCDIR := src                                                                   
SRC := $(shell find $(srcDir) -name "*.cpp")                                    
DIR := .obj                                                                     
OBJ := $(SRC:%.cpp=$(DIR)/%.o)                                                  
DEP := $(OBJ:.o=.d)                                                             

CXXFLAGS += -std=c++11                                                          
CXXFLAGS += -I /home/arman/lib/eigen-eigen-6b38706d90a9                  
CXXFLAGS += -I /home/arman/lib/boost_1_55_0                              
CXXFLAGS += -I /home/arman/lib/lodepng/                                  
CXXFLAGS += -L /home/arman/lib/boost_1_55_0/stage/lib                    
CPPFLAGS += -MMD -MP                                                            

.PHONY: all clean                                                               

-include $(DEP)                                                                 

all: $(EXE)                                                                     

$(EXE):   $(OBJ)                                                                
        $(CXX) $(OBJ) -o $@                                                     

$(DIR)/%.o: %.cpp                                                               
        $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $< -I $(SRCDIR)                 

clean:                                                                          
        $(RM) -f $(DIR)                                                         

我现在收到以下错误:

src/core/file1.cpp:839:1:致命错误:打开依赖文件.obj/./src/core/file1.d:没有这样的文件或目录

请注意,我有以下目录结构:

/prog/makefile -> makefile /prog/dir1/ -> 一些 cpp/hpp 文件 /prog/dir2/ -> 更多 cpp/hpp 文件 /prog/ ->这里也有一些cpp/hpp文件

我有很多文件夹(不仅仅是dir1 and dir2)所以我不想每次都指定它们。


EXE := a.out
SRC := $(wildcard *.cpp)
OBJ := $(SRC:.cpp=.o)
DEP := $(OBJ:.o=.d)

CPPFLAGS := -MMD -MP -I.

.PHONY: all clean

all: $(EXE)

$(EXE): $(OBJ)
    $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@

clean:
    $(RM) $(OBJ) $(DEP)

-include $(DEP)

您还可以通过一点努力来编译您的.o and .d将文件放入隐藏文件夹中,如下所示:

EXE := a.out
SRC := $(wildcard *.cpp)
DIR := .obj
OBJ := $(SRC:%.cpp=$(DIR)/%.o)
DEP := $(OBJ:.o=.d)

CPPFLAGS := -MMD -MP -I.

.PHONY: all clean

all: $(EXE)

$(EXE): $(OBJ)
    $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(DIR)/%.o: %.cpp | $(DIR)
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<

$(DIR):
    @mkdir $@

clean:
    $(RM) -r $(DIR)

-include $(DEP)

EDIT:这是我对您的编辑的尝试:

一些快速说明,$(LDLIBS)在这里为您-l标志,而$(LDFLAGS)是为了-L flags.

SRCDIR := src
OBJDIR := .obj

EXE := a.out
SRC := $(shell find $(SRCDIR) -name "*.cpp")
OBJ := $(SRC:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)
DEP := $(OBJ:.o=.d)

CPPFLAGS := -MMD -MP
CPPFLAGS += -I$(SRCDIR)
CPPFLAGS += -I$(HOME)/lib/eigen-eigen-6b38706d90a9
CPPFLAGS += -I$(HOME)/lib/boost_1_55_0
CPPFLAGS += -I$(HOME)/lib/lodepng/
CXXFLAGS := -std=c++11
LDFLAGS  += -L$(HOME)/lib/boost_1_55_0/stage/lib
LDLIBS   := 

.PHONY: all clean

all: $(EXE)

$(EXE): $(OBJ)
    $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@    

.SECONDEXPANSION:
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp | $$(@D)/
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<

%/:
    mkdir -p $@

clean:
    $(RM) -r $(OBJDIR)

-include $(DEP)

告诉我是否缺少什么。

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

如何确保我的 makefile 检测到头文件和 cpp 文件中的更改? 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 在 Selenium 的 FirefoxOptions 中设置 BrowserExecutableLocation 并不能防止出现“无法找到匹配的功能集”错误

    我对 Selenium 还很陌生 并且正在尝试创建一些最低限度通过的测试用例 我想您可以将它们称为某种意义上的 hello world 程序 我尝试创建一个 Firefox 驱动程序的实例 如下所示 var options new Fire
  • 将图像裁剪为圆形并添加边框

    我正在尝试裁剪圆形图像并在其周围添加边框 下面是我裁剪圆形图像的代码
  • OpenMPI:简单的 2 节点设置

    我在仅使用两个节点运行 OpenMPI 程序时遇到问题 其中一个节点与正在执行的机器是同一台机器 mpiexec命令和另一个节点是一台单独的机器 我将调用正在运行 mpiexec 的机器 master 以及另一个节点slave On bot
  • 使用 data.table [R] 查找组中众数出现的次数

    我一直在使用这里的优秀答案查找具有数据表的组的众数 但是 我还想查找每组变量 y 的 x 模态值出现的次数 我怎样才能做到这一点 编辑 有一种比上面链接的答案更快的方法来查找模式 我找不到从中得到的答案 如果有 请编辑并链接 但它使用此功能
  • React-router重定向到index.html并从.htaccess中的url中删除www

    我正在 ReactJS 中构建一个小型应用程序 因此所有页面都需要提供index html 并且 JS 处理 url 这很好用 但我还想让 htaccess 从网址中删除 www 如果存在 我正在阅读 mod rewrite 文档 但我不太
  • 如何在 Windows 7 中将 URL 参数从 Java 传递到本地 HTML 文件?

    我迫切需要您的专业知识来解决 Windows 7 问题 设想 我有一个基于框架的帮助包 它是为上下文相关的帮助调用而设置的 Java 应用程序能够通过将表示所需 HTML 的名为 anchor 的标记传递到名为 pophelp 的 HTML
  • 从输入文件读取实际值时出现浮点异常

    我尝试从输入文件中读取浮点值Fortran 为此 我使用以下代码 INTEGER nf REAL re OPEN newunit nf file toto txt READ unit nf fmt re 与 toto txt 包含我的真实值
  • Octave / MATLAB 中的 deal() 函数有什么意义?

    一些参考代码使用了该函数deal 简单地说 就像 a b c deal 1 2 3 如文档中所述 对于八度 and 对于MATLAB 该函数只是将输入复制到输出 Why use deal 在这种情况下 甚至在一般情况下 我正在尝试学习 更正
  • Django:从模板内访问会话变量?

    如果我在 Django 中设置一个会话变量 例如 request session name name 有没有办法可以从模板中访问它 或者我是否必须从视图中检索它 然后将其传递给模板 之所以这么问 是因为我想在模板中访问大约 10 个小会话变
  • 在 Angular 5 中迭代复杂的 JSON 结构

    如何在 Angular 5 中迭代 JSON 已经搜索了很多 得到了一个管道概念 但它不适用于复杂的 json 如下所示 我需要使用以下类型的数据创建可扩展表 我一直在阅读这个 json data Items Key 9009 type f
  • 如何使用 javascript 阻止因空字段而提交表单?

    如何在 javascript 中编写脚本来输出错误并防止表单中存在空字段时提交表单 假设表单名称为 form 输入名称为 name 我在 PHP 中遇到了一些麻烦 并不总是正确处理空字段 所以我想将其作为备份 如有任何帮助 我们将不胜感激
  • Sparklyr 更改所有列名称 Spark DataFrame

    我打算更改所有列名称 目前的重命名或选择操作太费力了 不知道有没有人有更好的解决方案 示例如下 df lt data frame oldname1 LETTERS oldname2 1 oldname200 APPLE df tbl lt
  • F5浏览器刷新和回发有区别吗?(asp.NET)

    我正在 asp NET 中现有数据网格的不同行中动态创建拖网格 我生成的数据网格有一列是 TemplateColumn 复选框列 在我的父数据网格中 我有一个带有复选框的模板列 当我选中或取消选中复选框的值时 会调用 check chang
  • Flutter:如何使用变量将参数传递给 Widget?

    这是一些伪代码 显示了我想要实现的目标 Text txt text subtitle false final params subtitle textAlign TextAlign center style TextStyle color
  • 如何检查 css box-shadow 是否受支持(jQuery)?

    我正在创建一个完整的 css 布局 但是 某些浏览器 例如IE6 不支持box shadow 和 webkit box shadow或 moz box shadow 我想检查一下是否不支持 然后添加其他样式 这在 jQuery 中怎么可能呢
  • 在 Heroku 上结合使用 Resque、Puma 和 Scheduler

    在查看了大量指南后 我想确认我的设置 现在我的procfile好像 web bundle exec puma C config puma rb config ru resque TERM CHILD 1 RESQUE TERM TIMEOU
  • 如何恢复用 jQuery 删除的元素?

    如果使用删除元素 notification remove 我们如何将其创建回来 你无法得到那个特定的例子后退 使用 remove 将其从 DOM 中删除 不过 您可以创建它的克隆 在 DOM 中移动它 隐藏它等等 根据您的项目需求 您可能还
  • 读取行时,awk $line

    我有一个包含数字列表的文件 我有第二个文件 每个文件包含各种条目和多个字段 我想要做的是获取第 12 个字段等于第一个数字的所有行 并将它们放入一个新文件中 然后放入第二个数字 依此类推 我写了一句很有道理的俏皮话 但我不明白为什么它行不通
  • Spring 4 静态内容(如 css/js)带来错误 405 不支持请求方法“GET”

    我已经检查过这个问题 但是经过 4 个小时的尝试 没有任何结果对我有用 尝试访问我的 css 文件时收到 405 错误 这是我的 Config java package com myapp config import org springf
  • 如何确保我的 makefile 检测到头文件和 cpp 文件中的更改?

    目前 每当我这样做时make我的 makefile 告诉我 make some obj file o 是最新的 无论我是否编辑了生成该目标文件所涉及的任何文件 我如何让它检测变化 这是一个重现该问题的简单 makefile SHELL bi