如何更改 GNU Make 中的当前目录

2023-11-22

我想将源目录与目标目录分开。看来从 Makefile 更改当前工作目录应该是最简单的解决方案。

由于以下缺点,目标的显式路径是不够的:

  1. Makefile 中的冗余代码,因为对目标的每个引用都应以变量为前缀。
  2. 更复杂的命令行来构建特定的中间目标(对于调试来说更糟糕)。

也可以看看保罗斯规则#3:

如果目标是在当前的工作中建立的,那么生活是最简单的 目录。

关于VPATH— 我也同意要求开发人员“在运行 make 之前更改到目标目录是一件痛苦的事情”。


在单独的目录中构建目标是很常见的make实践 那个 GNUmake方便地支持,无需更改目录或 调用辅助工具。这是一个例行说明:

Makefile

srcs := main.c foo.c
blddir := bld
objs := $(addprefix $(blddir)/,$(srcs:.c=.o))
exe := $(blddir)/prog

.PHONY: all clean

all: $(exe)

$(blddir):
    mkdir -p $@

$(blddir)/%.o: %.c | $(blddir)
    $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<

$(exe) : $(objs)
    $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)

clean:
    rm -fr $(blddir)

其运行方式如下:

$ make
mkdir -p bld
cc   -c -o bld/main.o main.c
cc   -c -o bld/foo.o foo.c
cc -o bld/prog bld/main.o bld/foo.o

Cribs:-

  • $(addprefix $(blddir)/,$(srcs:.c=.o))
    • 8.2 字符串替换和分析函数
    • 6.3.1 替换参考
  • $(blddir)/%.o: %.c | $(blddir)
    • 10.5 定义和重新定义模式规则
    • 4.3 先决条件的类型

可能有充分的理由make更改其工作目录但是 仅仅将构建产品放在单独的目录中并不是这样。

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

如何更改 GNU Make 中的当前目录 的相关文章

  • GNU Make 与 patsubst:需要两次替换

    我需要在变量替换的替换中引用词干两次 O23 OROOTS ODIR overx 2wk 3wk mlb 我需要使用相同的词干执行两次替换 但是替换使用patsubst这只做第一个 我们怎样才能同时实现这两点呢 事实上 杰克几乎猜对了 fo
  • 在 makefile 中,当我在 bash 函数内部使用 if 语句时,它会抛出错误

    在 makefile 中 当我在 bash 函数内部使用 if 语句时 它会抛出错误 test foo if a a then echo 1 fi foo hello ERROR bin sh 1 未找到 或与一个 test foo if
  • 在 macOS 上更新 GNU make

    我从下载了 GNU make 4 2 1here http ftp gnu org gnu make make 4 2 1 tar gz 并按照展开文件夹中的 INSTALL 文件中的说明安装它 现在我跑make v在 shell 中 我仍
  • 从 Makefile 中的 C++FLAGS 中删除一个标志?

    我有一个 Makefile 其中包含另一个设置了很多默认值的 makefile 我无法编辑包含的 makefile 并且我想更改 makefile 中 C FLAGS 的值 即使它是在包含的 makefile 中设置的 具体来说 每当 de
  • 如何不在输出中打印 makefile 中的注释

    我有一个像这样的 makefile install somecommand some explanation for next command lastcommand 发生的事情是评论 some explanation for next c
  • 用于发布和调试目标的 Makefile

    我正在尝试构建一个 Makefile 它可以通过指定目标而不是变量 例如make debug 1 不太好 我这里有一个精简的简化示例 它模拟了我想要实现的目标 ifdef debug BINARY my binary debug MODUL
  • @:(符号冒号)在 Makefile 中意味着什么?

    Makefile 中的以下内容有何作用 rule deps 我在制作手册中似乎找不到这个 它的意思是 不要在输出中回显此命令 所以这条规则是说 执行 shell 命令 并且不回显输出 当然是shell命令 是一个空操作 所以这就是说 什么都
  • 什么是“制定目标”?

    为什么我需要制作一个make target在能够构建我的源代码之前 更具体地说 什么是制定目标 http publib boulder ibm com infocenter rsdvhelp v6r0m1 index jsp topic o
  • 如何制作一个makefile只用于编译一些java文件?

    我有三个java文件 名为A java B java C java A将创建对象B B将创建对象C 但我以前从未构建过makefile 有谁可以帮我构建一个 makefile 来编译这三个 java 文件吗 我应该使用什么工具来制作 mak
  • 具有两个同名目标的 Makefile

    我有一个包含包含语句的 makefile 我无法控制包含的 makefile 的内容 不过 我希望能够在 某些 不是全部 目标之前添加一些预处理步骤 考虑以下示例 install echo install target include ot
  • GNU make 的回溯

    有没有办法让 GNU make 打印导致命令失败时执行的目标的 回溯 我经常处理严重混淆的 makefile 同时解决在新系统上构建软件的可移植性问题 这对于 make 来说似乎是一件非常简单的事情 这将极大地帮助调试 但我找不到任何方法来
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • 在 Mac 上更新 Make 版本

    我正在尝试更新 mac 上的 make 版本 但遇到了问题 最小项目依赖项是 4 1 但我的版本似乎是 3 81 我已将 Xcode 更新到最新版本并安装了命令行工具 但它似乎仍然是旧版本 有谁遇到过这个问题或知道解决方法吗 这是我所做的
  • 与 GNU Make 等 Python 相关的并行任务并发

    我正在寻找一种方法或者可能是一种哲学方法来如何在 python 中执行类似 GNU Make 的操作 目前 我们使用 makefile 来执行处理 因为 makefile 非常擅长通过更改单个选项 j x 进行并行运行 此外 gnu mak
  • 在 Ubuntu 16.04 上编译 PCL 1.7,CMake 生成的 Makefile 中出现错误

    我正在尝试让 PCL 1 7 点云库 而不是其他 pcl 在 Ubuntu 16 04 上运行 我最终希望用于 C 的东西 但现在我只是想让这些例子工作 我使用的是 Ubuntu GNU 5 3 1 附带的默认编译器和 Cmake 版本 3
  • 致命错误:向量:没有这样的文件或目录

    我有一个 Android 项目 其中包含大量 C 本机代码 但是 我无法构建我的库 因为它无法找到 vector h 头文件 可能是什么问题 我在几乎所有页面中包含的示例 include
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • Makefiles - ar: *.a: 没有这样的文件或目录....但是有...它就在那里

    尝试编译朋友的代码 但他没有包含 Makefile 我构建了自己的代码 并对我遇到的问题感到困惑 我认为最好将 Makefile 的完整内容发布在下面 我尽量保持简短 CFLAGS Wall pedantic LFLAGS CC gcc R
  • 是否可以使用现有的 Makefile 在 Code::Blocks 中构建项目?

    编辑 我发现项目属性中有一个选项可以设置自定义生成文件 现在项目构建良好 现在 我偶然发现了如何在单击 运行 时指定要运行的目标可执行文件 代码 块 http www codeblocks org is an IDE https en wi
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译

随机推荐

  • 在 C# 中将 Windows 窗体单选按钮与不同的父控件分组

    我有一个 Windows 窗体应用程序 其中有许多单选按钮 这些RadioButtons 被放置在流程布局面板它会自动为我安排它们 所有直接添加到 FlowLayoutPanel 的 RadioButton 都被分组 这意味着我只能选择其中
  • 洋葱架构中的依赖解析

    The 洋葱架构是一种构建应用程序以保持关注点分离和松散耦合的方法 示例项目位于 http onionarch codeplex com 依赖注入 解析是该架构的一个关键方面 因为它用于将所有层连接在一起 上面的链接包含一个有关如何使用 O
  • Java EE前端方法中处理服务层异常

    我维护一个 Web 应用程序 其中有一个带有 JSF 标签的页面
  • 生成 Word 文档时检索组件错误的 COM 类工厂

    我正在尝试从 VB NET 编辑 Word 文档 大部分使用以下代码 如何从 Visual Basic NET 自动创建 Word 来创建新文档 http support microsoft com kb 316383 它在我的机器上运行良
  • Vim 写入时自动命令 - 传递完整文件路径

    我想在 Vim 中保存文件时执行 bash 脚本 问题是我不知道如何才能 或者是否可以传递文件的完整路径 而不仅仅是文件名或打开的相对路径 这是我正在使用的代码 它可以工作 但是只有相对路径 这对我来说毫无用处 autocmd BufWri
  • 升级到 iPhone 3.0 sdk,现在模拟器显示黑屏

    我有一个使用 UITabBarController 的 iPhone 应用程序 其中包含两个 UINavigationController 每个 UINavigationController 又包含一个或多个 TableViewContro
  • 连接简单 x-y 图中的最终点和初始点(绘制闭合曲线/多边形)

    比如说 我有 x 1 1 2 2 y 1 2 2 1 plot x y b 我将得到一个包含连接点 1 1 1 2 和 2 2 的线的图 有没有办法将最后一个点与第一个点连接起来 从而完成绘图上的正方形 我还用点拉入文本行 因此简单地添加另
  • Android 10 (api 29) 中没有此类文件或目录

    我正在开发一个照片编辑器应用程序 在编辑我的图片后 我将其保存到本地存储中 它在 android 9 之前工作正常 但在 android 10 上则不然 它在 Android 10 中显示 找不到此类文件或目录 的异常 经过一些研究 我发现
  • 未找到 Visual Studio 2013 库中的实体框架

    当我尝试使用实体框架时 我在 Visual Studio 2013 的 Visual Basic 中遇到了一个相当不寻常的错误 无论我使用现有项目还是创建新项目 这都无关紧要 当我换了一台装有 Win 8 1 的新电脑时 这种情况就开始发生
  • 将 F# 引用转换为 LINQ 表达式

    我可以转换类型的报价Expr lt a gt b gt 通过以下代码片段连接到 Linq 表达式 Converts a F Expression to a LINQ Lambda let toLambda exp Expr let linq
  • 在 Erlang 中转置二维矩阵

    给定如下所示的矩阵 将其变换 90 度 转换为下面的第二个矩阵 您将如何以最干净的方式做到这一点 首选简短 简洁 清晰的解决方案 其中要点易于掌握 From A1 A2 A3 B1 B2 B3 C1 C2 C3 To A1 B1 C1 A2
  • SQL:选择包含确切给定成员的集

    我确信有一个合适的词来形容这个问题 但我不记得了 但问题很容易描述 我有一个表groupmembers 这是组和成员之间的简单关系 id groupid memberid 1 g1 m1 2 g1 m2 3 g2 m1 4 g2 m2 5
  • Windows Server 2016 上的远程调试 UWP 应用

    The goal 我想使用 Windows Server 2016 x64 来远程调试 UWP 应用程序 原因 我的工作电脑仍然运行 Windows 7 实例 并且无法在 Windows 7 计算机上部署 UWP 应用程序 问题 我已经在
  • Ajax成功后调用函数

    我正在开发一个网站 我们从 XML 文件获取信息 它工作得很好 但现在我需要制作内容的滑块 为此 我将使用 jCarousel 它声称可以通过调用回调函数来动态加载内容 但是 当我成功调用函数时 我无法进行初始 ajax 加载 我究竟做错了
  • 使用 multipart/form-data 时,为什么无法正确发送带有 Unicode 的 POST 名称?

    我想发送一个带有附加文件的 POST 请求 尽管某些字段名称中包含 Unicode 字符 但服务器未正确接收它们 如下所示 gt gt gt normal without unicode gt gt gt resp requests pos
  • 枚举 和 Enumeration

    枚举 和 Enumeration 如果是这样 有什么区别 当您拥有其中之一时 您可以执行的操作没有实际差异 因为类型参数仅用于 输出 位置 另一方面 就可以使用的内容而言 存在很大差异as其中之一 假设你有一个Enumeration
  • JavaScript 模块模式 - 受保护的成员?

    哈喽 这是我的第一个问题 我正在尝试 Doug Crockford 等人提倡的模块模式 到目前为止 大多数人对此感到非常满意 但我有点不确定处理某种继承模式的最佳方法 我将其归结为使用猫和哺乳动物的简单案例 尽管我的实际意图是在画布上为基于
  • 向左浮动div,使所有div的高度等于其行中最高的div?

    我正在尝试一种设计 将一系列同一类的 div 浮动到左侧 我希望 div 适合行 其中每行中的 div 具有相同的高度 以便行之间和设计元素排列之间不会出现破损 有没有办法做到这一点 或者我本质上必须预设每个 div 的高度 我向左浮动是因
  • R 相当于 Python 的 re.findall

    我试图从字符串中获取 RegExp 的所有匹配项 但显然在 R 中这并不容易 或者我忽略了一些东西 说实话 这真的很令人困惑 我发现自己在所有选项中迷失了 str extract str match str match all regexe
  • 如何更改 GNU Make 中的当前目录

    我想将源目录与目标目录分开 看来从 Makefile 更改当前工作目录应该是最简单的解决方案 由于以下缺点 目标的显式路径是不够的 Makefile 中的冗余代码 因为对目标的每个引用都应以变量为前缀 更复杂的命令行来构建特定的中间目标 对