makefile自动src文件检测和依赖生成

2023-11-29

我的 C++ 项目有以下设置:

在src文件夹中,有*.cpp和相应的*.h文件以及 在 obj 文件夹中我想要我的 .o 文件。

到目前为止,编译和链接都不是问题。但现在我有太多的 .cpp 和 .h 文件,无法手动将它们放入 Makefile 中。所以我决定在 makefile 中写下这个小指令:

collect_sources:
@echo "collecting source files";
@echo "SRCS = \\" > sources;
@for file in ./src/*.cpp; \
do \
    echo "$$file \\" >> sources; \
done

我也做

-include sources

在 makefile 的开头

生成的文件sources看起来不错,尽管最后一行有一个我不喜欢的反斜杠。但据我所知,它也应该是有害的。

我现在还需要自动构建依赖关系。在我的上一个版本中,我将 *.cpp 文件定义为SRCS直接在Makefile中,下面的代码就很好:

$(SRCDIR)/%.cpp:
  @$(CXX) $(DEPFLAGS) -MT \
  "$(subst $(SRCDIR),$(OBJDIR),$(subst $(EXT_SRC),$(EXT_OBJ),$$file))" \
  $(addprefix ,$$file) >> $(DEP);
clear_dependencies:
    echo "" > $(DEP);

depend: clear_dependencies $(SRCS)

但随着包括sources-file,它永远不会到达上面的代码块。

以下是 Makefile 顶部定义的常量:

CXX = g++
CXXFLAGS = -Wall \
       -Wextra \
       -Wuninitialized \
       -Wmissing-declarations \
       -pedantic \
       -O3 \
       -p -g -pg
LDFLAGS =  -p -g -pg
DEPFLAGS = -MM

SRCDIR  = ./src
OBJDIR  = ./obj

TARGET = ./bin/my_funky_function_which_is_not_the_real_name

-include sources

OBJSTMP =   $(SRCS:.cpp=.o)
OBJS        =   $(OBJSTMP:$(SRCDIR)=$(OBJDIR))
DEP = depend.main
EXT_SRC =   .cpp
EXT_OBJ =   .o

我缺少什么?我的方法有效/可行吗?


好吧,你自找的。

1: Your collect_sources:... include sources是光荣的鲁布·戈德堡黑客。只需这样做:

SRCS = $(wildcard ./src/*.cpp)

如果你想通过肉眼确认,你可以这样做:

$(info $(SRCS))

2:

clear_dependencies:
    echo "" > $(DEP);

只是为了美观,让我们解决这个问题。

clear_dependencies:
    $(RM) $(DEP);

3:

$(SRCDIR)/%.cpp:
    @$(CXX) $(DEPFLAGS) -MT \
  "$(subst $(SRCDIR),$(OBJDIR),$(subst $(EXT_SRC),$(EXT_OBJ),$$file))" \
  $(addprefix ,$$file) >> $(DEP);

这需要一些工作。首先是眼前的问题:目标是一个存在的真实文件,并且该规则没有先决条件。因此,该规则将不会运行(我不知道为什么它在以前的版本中对您有用,也许还有其他不同)。作为临时修复,我建议我们切换到静态模式规则和 PHONY 目标:

.PHONY:$(SRCS)
$(SRCS) : $(SRCDIR)/%.cpp:
    @$(CXX) $(DEPFLAGS) -MT \
   ...

看看这一切是否有效,然后我们就可以解决大问题了。

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

makefile自动src文件检测和依赖生成 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 使用 Makefile 项目在 Visual Studio 中自定义调试命令

    我在 Visual Studio 2010 中有一个由 Makefile 支持的项目 实际上使用 NAnt 但这不是重点 构建过程的输出是一个 elf 文件 我有一个单独的非 VStudio 调试器 可以在该 elf 文件上运行来调试它 构
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

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

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

随机推荐

  • 从管道命令读取文件名

    所以我试图让 C 程序从命令行读取以下格式的文件名 cat 文件名路径 节目名称 当它作为命令行参数输入时 我可以让它读取输入文件的名称 但它不会从连接的参数中读取 这是代码 现在它读取文件名 就像在命令行上的程序名称后面写入一样 incl
  • 在 Vec 的中间或开头有效地插入或替换多个元素?

    有没有直接的方法来插入或替换多个元素 T and or Vec
  • 计算假期:Oracle中查询给定日期范围内的星期六和星期日的数量

    我想计算假期 在Oracle中查询给定日期范围内的星期六和星期日的数量 你可以使用行生成器技术首先生成给定范围的日期 然后仅计算周六和周日 例如 此查询将提供 2014 年 1 月 1 日至 2014 年 12 月 31 日期间星期六和星期
  • 如何使用 Google-Maps-for-Rails 将信息窗口自动显示为打开状态

    我想显示一张地图 其中为页面上的单个标记自动显示信息窗口框 就像http code google com apis maps documentation javascript examples map coordinates html 我尝
  • 通过Javascript调用C#函数(不使用Json)

    我在 JavaScript Mypage aspx 中有一个名为 callfunction 的函数 该函数应该调用 C 中的另一个函数 func Mypage aspx cs 像这样的事情 在我的页面 aspx 中 function cal
  • Python CSV 导入以及嵌套列表创建

    我试图简单地将 csv 导入到 Python 中 我读过很多文档 但我一生都不知道如何执行以下操作 CSV格式如下 NYC 22 55 BOSTON 39 22 我试图生成以下内容 NYC 22 55 BOSTON 39 22 以便我可以在
  • R 中的月环比客户保留率

    我正在尝试提出一种使用 39 万行的大型数据集计算逐月客户保留率的方法 基本上 我想知道一个月内在场的客户与上个月在场的客户的百分比 因此 如果上个月 客户 a b 和 c 购买了一种产品 本月 客户 b c 和 d 进行了购买 上个月的三
  • 如何与pipenv共享虚拟环境?

    Pipenv 虚拟环境 venv 将与子文件夹共享 例如 如果您安装了venv in foo 它将可以在 foo baz 但如果你想分享相同的内容怎么办venv之间 foo bob and baz alice 以下对我有用 我希望它能有所帮
  • 对数据框中的数据列重新排序(删除/更改顺序)

    我有两个大型数据集 并且我正在尝试重新格式化旧数据集 以将问题按照与新数据集相同的顺序排列 这样我就可以轻松地对每个相同的问题执行 t 检验 以跟踪 2 个数据集的显着变化 数据集之间的年数 新版本在旧版本的基础上删除了一些问题 并增加了一
  • 在android sdk中的两个位置之间的地图中绘制线条时出现问题

    package com hands import java net HttpURLConnection import java net URL import javax xml parsers DocumentBuilder import
  • 在 JavaScript 中旋转数组中的元素

    我想知道旋转 JavaScript 数组最有效的方法是什么 我想出了这个解决方案 其中一个积极的n将数组向右旋转 负数n向左转 length lt n lt length Array prototype rotateRight functi
  • 使用 Python 对 PDF 文件进行文本挖掘?

    python 是否有一个包 库可以让我打开 PDF 并在文本中搜索某些单词 Using PyPdf2您可以使用提取文本 提取 pdf 文本并对其进行处理的方法 更新 更改了文本以引用 PyPdf2 感谢 Aditya Kumar 的提醒
  • 如何创建具有重复数据的 Jsoup.select.Elements?

    我有一个网页 table class table gradient table tbody tr td class time div 10 30 12 05 div td td class time div 12 30 14 05 div
  • 使用 填充多列的动态数组列表

    我正在尝试在多个表列上填充 ArrayList 这最初是在旧页面上使用 Scriptlet 完成的 但我知道这种做法现在不受欢迎 我在使用 struts 标签翻译它时遇到了麻烦 我希望桌子最终是这样的 Checkbox 1 Name 1 C
  • CustomAdapter 的 getView() 出现意外行为

    我有一个ViewHolder像这样的类 static class ViewHolder protected String fileName protected Bitmap bitmap null protected CheckBox ch
  • Silverlight 中的位图图像大小限制

    我正在制作一个 Windows Phone 7 应用程序 其中涉及从网络获取大图像并将其放入ScrollViewer供用户滚动浏览 我想我已经达到了限制BitmapImage不过 图像似乎在高度或宽度上被截断为 2048 像素 这是 Sil
  • iOS 查找平均速度

    我已经有一些东西可以显示我当前的速度和最高速度 下面代码中的最大速度 现在我想做一些东西来计算我的平均速度和核心位置 如何 谢谢 void locationUpdate CLLocation location speedLabel text
  • ActionScript 3 中的游戏逻辑和游戏循环

    我正在使用 flash actionscript 3 制作一个射击游戏 并且对逻辑流程以及如何巧妙地使用 OOP 概念有一些疑问 主要有3类 主类 初始化屏幕上的对象 敌人类别 用于在屏幕上移动敌人 子弹类别 用于射击 我想做的是查明敌人是
  • 为什么模板化右值引用接受左值?

    我看到类似的用法 include
  • makefile自动src文件检测和依赖生成

    我的 C 项目有以下设置 在src文件夹中 有 cpp和相应的 h文件以及 在 obj 文件夹中我想要我的 o 文件 到目前为止 编译和链接都不是问题 但现在我有太多的 cpp 和 h 文件 无法手动将它们放入 Makefile 中 所以我