![](/img/trans.png)
[英]Makefile : Automatically compile all c files, keeping .o files in separate folder
[英]Create a Makefile to compile all .c files in a folder/subfolder and ship the binaries elsewhere
我目前正在学习 K&R,我想创建一个 Makefile 以自动化编译过程。
我的目录结构如下:
k-r/
chapter-1/
exe/
1-1/
program1.c
program2.c
...
1-2/
program3.c
program4.c
...
ch1.c
ch1.h
大多数程序都是独立的,但有些程序需要在 kr/chapter-1/ch1.c 和 kr/chapter-1/ch1.h 中定义的函数。
我想编译 kr/chapter-1/1-1、kr/chapter-1/1-2 等中的所有程序,并将可执行二进制文件发送到 kr/chapter-1/exe。
以下是我到目前为止所拥有的并且它有效,但我想知道是否有更有效的方法来做到这一点,例如不必列出文件名?
CC := clang
CFLAGS := -Wall
LIB := ../ch1.c
BIN := ../exe/
.PHONY: all clean 1-1 1-2
all: 1-1 1-2
1-1:
cd 1-1 && \
$(CC) $(CFLAGS) program1.c -o $(BIN)program1.exe && \
$(CC) $(CFLAGS) program2.c -o $(BIN)program2.exe && \
1-2:
cd 1-2 && \
$(CC) $(CFLAGS) program3.c $(LIB) -o $(BIN)program3.exe && \
$(CC) $(CFLAGS) program4.c $(LIB) -o $(BIN)program4.exe && \
clean:
rm exe/*
我假设“高效”是指“更通用/自动化”。 这是我能想到的最“有效”的解决方案:
CC := gcc
CFLAGS := -Wall
BIN_DIR := exe
SRC_DIRS := $(wildcard *-*)
.PHONY: all clean $(SRC_DIRS)
all: $(SRC_DIRS)
clean:
del /s /q $(BIN_DIR)\*
define SETUP_TARGETS
$(1): $$(patsubst $(1)/%.c,$(BIN_DIR)/%.exe,$$(wildcard $(1)/*.c))
$(BIN_DIR)/%.exe: $(1)/%.c $$(wildcard *.c)
$(CC) $(CFLAGS) $$(addprefix -I ,$$(patsubst %/,%,$$(dir $$^))) $$^ -o $$@
endef
$(foreach target,$(SRC_DIRS),$(eval $(call SETUP_TARGETS,$(target))))
关于makefile的观察:
.exe
,我假设您在 MS-Windows 上运行 GNU Make。 因此,我使用了命令提示符语法和.exe
扩展名。chapter-1/
)。TAB
字符开头,而不是空格。exe/
已经存在并且永远存在。*-*
匹配的每个子目录(例如 1-1、1-2、...),并为每个子目录创建一个目标。make target
(target 是一个子目录,例如 1-1, 1-2, ...) 将为目标子目录中的每个源文件在exe/
中创建一个可执行文件。 我假设每个源文件都有一个函数main()
。*.c
(在本例中为ch1.c
)。 我假设这些来源不包含函数main()
。#include
到您的程序中。make
和make all
将构建所有目标。make clean
将删除exe/
中的每个文件。make: Nothing to be done for '1-1'
的警告。享受 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.