gpt4 book ai didi

c - 具有多个子模块的 Makefile

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:57 25 4
gpt4 key购买 nike

我有以下程序结构:

main.c
Makefile
Submodule
--{somefiles}
--Makefile

子模块正在创建库 submodule.a。它有很多源文件,需要一些库。

我只想知道

    子模块中的
  1. Makefile 知道如何制作 submodule.a
  2. 子模块中的
  3. Makefile 设置变量 SUBMODULE_LDFLAGSSUBMODULE_LDLIBS

如何在根项目目录中编写 Makefile:

  1. 它将在子模块中使用 Makefile 创建 submodule.a
  2. 它会将 SUBMODULE_LDFLAGSSUBMODULE_LDLIBS 添加到它自己的变量中吗?

最后,我希望主 Makefile 中的以下命令能够正常工作:

TARGET = MyProgram
OBJS = $(TARGET).o submodule/submodule.a

$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)

现在它创建了MyProgram.o并且不能创建MyProgram,因为Makefile不知道如何制作submodule/submodule .a.

我可以添加行:

submodule/submodule.a:
make -C submodule

但它不会帮助我解决缺少的库。

最佳答案

子Make 没有直接的方法将变量传递给父进程。有(至少)两种间接方式。

您可以让子 Make 编写一个包含变量值的文件,然后父 Make 可以读取该文件。

您可以复制 submodule/Makefile 中构造这些变量的部分,并将其放入 Makefile 中。更好的是,您可以将该代码隔离在一个单独的文件中,然后两个 makefile 都会include

编辑:

递归 Make 的一个缺点是它会中断 Make 的大部分依赖处理。在这种情况下,当且仅当库的其中一个源发生更改时,没有干净的方法让子 make 运行。

您可以将子模块源列表——或构建列表的代码——放在一个单独的文件中,两个 makefile 都将包括。然后这些文件可以是 $(TARGET) 的先决条件。

或者,您可以将 submodule/submodule.a 设为 PHONY 目标。在那种情况下,Make 每次都会重建二进制文件,否则它会完美地工作。

关于c - 具有多个子模块的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20176202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com