使用 make 构建多个二进制文件

2024-04-18

我想创建一个 Makefile(在父目录中)来调用其他几个 Makefile(在子目录中),这样我就可以通过仅调用一个父 Makefile 来构建多个二进制文件(每个项目子目录一个)。

我的研究因在递归 Makefile 上找到大量内容而受到阻碍,但我认为这就是您尝试将多个目录 Makefile 构建到一个目录中的地方。single binary?

也许我想做的最好是通过 shell 脚本更好地处理,也许依次在每个子目录中调用 make,但我认为 Makefile 可能是一个更优雅的解决方案?

非常感谢收到的任何指点

PS使用linux和GNU工具链


上面第一个答案中给出的 for 循环解决方案实际上不应该按原样使用。在这种方法中,如果您的子版本之一失败,构建将不会失败(应该如此),而是继续使用其他目录。不仅如此,构建的最终结果将是最后一个子目录 make 的退出代码,因此如果成功,即使其他子目录失败,构建也会成功。不好!!

您可以通过执行以下操作来修复它:

all: 
        @for dir in $(SUBDIRS); \
        do \
            $(MAKE) -C $${dir} $@ || exit $$?; \
        done

然而现在你遇到了相反的问题:如果你运行“make -k”(即使有错误也继续)那么在这种情况下将不会遵守。失败时它仍然会退出。

上述两种方法的另一个问题是它们会序列化所有子目录的构建,因此如果您启用并行构建(使用 make 的 -j 选项),则只会在单个子目录中发生,而不是在所有子目录中发生。

Eregrith 和 sinsedrix 的解决方案更接近您想要的,但仅供参考,当您调用递归 make 调用时,您永远不应该使用“make”。正如 johfel 的示例所示,您应该始终使用 $(MAKE)。

像这样的东西就是你想要的:

SUBDIRS = subdir1 subdir1 subdir3 ...

all: $(addprefix all.,$(SUBDIRS))
all.%:
        @ $(MAKE) -C '$*' '$(basename $@)'
.PHONY: $(addprefix all.,$(SUBDIRS))

当然,您可以为其他目标添加更多这样的节,例如“安装”或其他目标。还有更奇特的方法来处理具有任何通用目标的构建子目录,但这需要更多细节。

如果您想支持并行构建,您可能需要在此级别声明依赖关系,以避免并行构建相互依赖的目录。例如,在上面,如果在 subdir1 和 subdir2 都完成之前无法构建 subdir3 (但 subdir1 和 subdir2 可以并行构建),那么你可以在 makefile 中添加如下内容:

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

使用 make 构建多个二进制文件 的相关文章

  • 检查 makefile 中的文件大小,如果文件太短则停止

    有没有办法检查特定文件的大小是否小于某个常量 我在 makefile 中假设有关大小的事情 并希望确保如果不满足我的假设 我会收到错误 类似于断言 但在 makefile 中 if filesize file gt C then error
  • 在 makefile 中,当我在 bash 函数内部使用 if 语句时,它会抛出错误

    在 makefile 中 当我在 bash 函数内部使用 if 语句时 它会抛出错误 test foo if a a then echo 1 fi foo hello ERROR bin sh 1 未找到 或与一个 test foo if
  • Makefile 和通配符

    好吧 这是我当前的 makefile 设置 有一些文件名为public01 c public02 c等等 我正在尝试使用以下方法为每个人制作目标文件public o带有通配符的标签 public o public c hashtable h
  • 如何调用位于其他目录的Makefile?

    我正在尝试这样做 我想打电话给 make Makefile存在于其他目录中 abc可以使用位于不同目录中的 shell 脚本的路径 我该怎么做呢 由于 shell 脚本不允许我cd进入Makefile目录并执行make 我怎样才能编写she
  • 在 Mac OS X 上的 Makefile 中设置 PATH(但它适用于 Linux)

    我可以在 Linux 上的 Makefile 中设置 PATH 但不能在 Mac OS X 上设置 在 OS X 中 可以设置 PATH 但不会使用 这是一个演示 在带有 bash 4 1 2 1 release 和 GNU Make 3
  • 用于发布和调试目标的 Makefile

    我正在尝试构建一个 Makefile 它可以通过指定目标而不是变量 例如make debug 1 不太好 我这里有一个精简的简化示例 它模拟了我想要实现的目标 ifdef debug BINARY my binary debug MODUL
  • 如何调用使用 Define 创建的 GNU make 宏?

    在我的 Makefile 中调用 GREP 的两种方式有什么区别吗 我有什么理由应该使用其中之一 两者似乎产生相同的结果 define GREP word 3 shell echo define FOO 0xfff00100 endef a
  • 避免重复 GNU Make 规则

    我一直在编写一个执行一些依赖项生成的 Makefile 我发现自己必须重复规则 因为 遗留 代码库包含以下内容的混合 cpp and cc文件 好像有点难看 无论如何 是否可以指定目标的先决条件可以是 cpp or cc files 所以而
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 如何在 Makefile 中获取 make 命令的 pid?

    我想使用此构建特有的临时目录 如何在 Makefile 中获取 make 命令的 pid I tried TEMPDIR tmp myprog 但这似乎存储TEMPDIR as tmp myprog 然后将 eval 作为每个引用此命令的新
  • 在 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
  • 在赋值时计算 Makefile 变量

    在 Makefile 中 我尝试将 shell 命令的结果分配给变量 TMP mktemp d tmp XXXXX all echo TMP echo TMP but make Makefile all 正在回显 2 个不同的值 例如 tm
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • Makefiles - ar: *.a: 没有这样的文件或目录....但是有...它就在那里

    尝试编译朋友的代码 但他没有包含 Makefile 我构建了自己的代码 并对我遇到的问题感到困惑 我认为最好将 Makefile 的完整内容发布在下面 我尽量保持简短 CFLAGS Wall pedantic LFLAGS CC gcc R
  • 多个源的 makefile

    在学习 make 文件时 我试图为多个源目录编写一个 make 文件 似乎我在某个地方错了 这是我的代码结构 directory common fun2 c inc fun h src fun1 c main c 这是我的生成文件 CC c
  • ubuntu 中的 echo -e 选项不起作用

    我的同事使用Ubuntu 我使用openSUSE 我们使用相同的makefile编译相同的源代码 我的环境运行良好 但我的同事不能 总是输出无法识别 e选项 我们检查makefile 只发现echo命令使用 e option Ubuntu的
  • 为什么 make 会删除我的临时文件?

    我有一个简单的 Makefile PHONY clean PROGRAMS patsubst main cpp example wildcard main cpp all PROGRAMS GCCVERSION shell gcc dump
  • 如何处理GNU make中的子make错误?

    我在 Makefile GNU 中使用子 make 但每当子 make 失败时 主 make 都会继续成功运行 我希望每当我的子 make 失败时我的主 Makefile 都会失败 我怎么做 all pushd STA DIR make c
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud

随机推荐