我将这些文件放在同一文件夹中:
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/