gpt4 book ai didi

c - Make - 如何构建依赖关系,以及如何定义多个目标?

转载 作者:太空宇宙 更新时间:2023-11-04 08:18:14 25 4
gpt4 key购买 nike

我是 makefile 的新手,我想执行几个操作。

我目前的makefile如下:

OBJECTS=radio_listener.o radio_app_comm_func.o
TARGET_EXECUTABLE=radio_listener

# Default target
all: ${TARGET_EXECUTABLE}

# Compile all required .o files this way
%.o: %.c
@echo "Compiling $<"
@gcc -c -g -m32 $< -o $@

# Compile target exe by combining all objects
${TARGET_EXECUTABLE}: ${OBJECTS}
@echo "Linking $@"
@gcc ${OBJECTS} -g -m32 -o $@

# Cleanup rule
clean:
@echo "Cleaning up..."
@rm -f *.o ${TARGET_EXECUTABLE}
@echo "Done."

.PHONY: clean all

1. 假设我执行“make”。然后更改 radio_app_comm_types.h 中的 MACRO 定义。

radio_app_comm_types.h 包含在 radio_app_comm_func.h 中。

更改 MACRO 并再次执行“make”后,我得到“Nothing to be done for 'all'”。

显然我需要以某种方式告诉我的 Makefile,radio_app_comm_func.h 依赖于 radio_app_comm_types.h。

如何做到这一点?

2. 让我感兴趣的第二件事是如何在不同的可执行文件中使用相同的 Makefile。

目前我只有radio_listener,但我计划添加radio_controlradio_server,它们的h 文件还将包括 radio_app_comm_func.h,可能还有一些其他 h 文件(以便使用它们的相关 .c 文件。

我怎样才能做到这一点?我希望实现如下流程:

a) 执行 ma​​ke,将为每个 exe 编译所有相关文件,最后将创建 3对我来说不同的可执行文件 - radio_listener、radio_control、radio_server

b) 执行ma​​ke server(例如),将仅<编译所有需要的相关文件 用于 radio_server(包括寻找变化,例如,在 radio_app_comm_types.h 中),最后只会为我创建 1 个可执行文件 - radio_server

c) 执行 ma​​ke controller ...编译 radio_control 等所需的所有内容(我想你明白我的意思)

如果相关的话,我正在使用 Ubuntu x64 系统。

任何帮助将不胜感激。

谢谢。

最佳答案

这是一个使用高级自动依赖规则的版本,并允许构建多个目标。更新顶部附近的标志并在 TARGETS 中创建新条目并创建一个新的 xxx_SRC 变量以添加新目标。

如果您想要当前目录中的依赖文件,您可以将 DEPDIR 更改为 . 或者遍历 makefile 并删除对它的引用,无论哪种方式。

TARGETS := exe1 exe2 exe3

DEPDIR = .d

exe1_SRC := foo.c bar.c
exe2_SRC := biz.c boz.c
exe3_SRC := bling.c blang.c

CC := gcc

CFLAGS := -g -O2
CPPFLAGS := -DXXX -I../include

LDFLAGS := -L../lib
LDLIBS := -lfoo -lbar

# ----- Nothing below here needs to be changed

.PHONY: all
all : $(TARGETS)

.SECONDEXPANSION:
# For each target, depend on the .o files for its sources
$(TARGETS): $$(patsubst %.c,%.o,$$($$@_SRC))
$(LINK.c) $^ $(LDLIBS) -o $@

ALLSRC := $(foreach T,$(TARGETS),$($T_SRC))

.PHONY: clean
clean:
rm -f $(TARGETS) *.o $(DEPDIR)/*.d

# -----
# Advanced auto-dependency, from:
# http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/

$(shell mkdir -p $(DEPDIR) >/dev/null)
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Td

COMPILE.c = $(CC) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
POSTCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d

%.o : %.c
%.o : %.c $(DEPDIR)/%.d
$(COMPILE.c) $(OUTPUT_OPTION) $<
$(POSTCOMPILE)

$(DEPDIR)/%.d: ;
.PRECIOUS: $(DEPDIR)/%.d

-include $(patsubst %,$(DEPDIR)/%.d,$(basename $(ALLSRC)))

关于c - Make - 如何构建依赖关系,以及如何定义多个目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34568850/

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