c - 如何在编译时在依赖文件中添加用户定义的依赖项

标签 c makefile

我将这些文件放在同一文件夹中:

a.c
b.c
common.c
liba.mk
libb.mk

“liba.mk”被指定编译“a.c”“common.c”并归档目标文件。 “libb.mk”正在对“b.c”“common.c”

进行类似的工作

我的问题是,“common.c” 出现在两个 makefile 中。如何对此添加依赖规则?我希望当我制作 "liba.mk" 然后制作 "libb.mk" 时,"libb.mk" 会重新编译“common.c”

这是我在 liba.mk 上的内容:

SRC_C = a.c common.c
SRC_O = $(patsubst %.c,%.o,$(SRC_C))

OBJ_LIST = $(addprefix liba/,$(patsubst %.c,%.o,$(SRC_C)))
DEPENDENCY_LIST = $(addprefix liba/,$(patsubst %.c,%.d,$(SRC_C)))

all: pre_action liba

.PHONY: pre_action
pre_action:
    mkdir liba

.PHONY: liba
liba: $(SRC_O)
    $(AR) rvs liba/liba.a $(OBJ_LIST)

$(SRC_O): %.o : %.c
    $(CC) -DLIBA -c $< -o $@
    $(CC) -DLIBA -c $< -MM -MT $@ -MF liba/$(patsubst %.o,%.d,$@)
    cp $@ liba/$(notdir $@)

-include $(DEPENDENCY_LIST)

.PHONY: clean
clean:
    rm -rf liba
    rm -f $(SRC_O)

和libb.mk有类似的内容:

SRC_C = b.c common.c
SRC_O = $(patsubst %.c,%.o,$(SRC_C))

OBJ_LIST = $(addprefix libb/,$(patsubst %.c,%.o,$(SRC_C)))
DEPENDENCY_LIST = $(addprefix libb/,$(patsubst %.c,%.d,$(SRC_C)))

all: pre_action libb

.PHONY: pre_action
pre_action:
    mkdir libb

.PHONY: libb
libb: $(SRC_O)
    $(AR) rvs libb/libb.a $(OBJ_LIST)

$(SRC_O): %.o : %.c
    $(CC) -DLIBB -c $< -o $@
    $(CC) -DLIBB -c $< -MM -MT $@ -MF libb/$(patsubst %.o,%.d,$@)
    cp $@ libb/$(notdir $@)

-include $(DEPENDENCY_LIST)

.PHONY: clean
clean:
    rm -rf libb
    rm -f $(SRC_O)

我想在生成依赖文件时需要附加额外的依赖项。但对依赖文件进行文件处理似乎很愚蠢。有没有更好的解决方案?

最佳答案

从您的评论中,我现在了解到您必须重新编译 common.c 因为它使用不同的编译器标志(-DLIBB-DLIBA )并且,由于 common.o 的依赖项(即 common.c 和可能的头文件)没有改变,因此没有重新编译 common.c >.

要实现这一点,您可以使用:

pre_action:
    rm common.o
    mkdir libb          # or liba

我的 make 有点生疏,但我相信它总能编译 common.c

关于c - 如何在编译时在依赖文件中添加用户定义的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40088654/

相关文章:

c++ - 如何在 "edit"按键上杀死 "Enter"控件的焦点

c - 使用 Visual HAM 在 C 中进行 GBA 编程

Makefile - 获取传递给 make 的参数

android - 编译为在 Android x86 架构上运行的 OpenSSL

gcc - 编译错误选项 -std=c99 或 -std=gnu99

c - 如何将值保存到PIC18?

c - 如何在 C 中将 setitimer 与 SIGALRM 一起使用

c++ - 为什么 getenv 是标准化的而不是 setenv?

c - 为什么我的追加函数不再写入文件

typescript - Makefile 编译所有 tsc 而不管更改