最近我和mingw32-make合作设置了一个学习项目。
目标是实现一个简单的makefile,它将从不同的文件夹中获取源文件,将所有生成的目标文件放在/ build文件夹中,将最终的可执行文件放在/ bin文件夹中(请参阅下面的预期结构)。 / p>
+-- bin (for binaries)
+-- build (for .o files)
+-- include
+-- lib
+-- src
+-- main (.c and .h files)
+-- xml (.c and .h files)
这是生成的makefile(实际上有效):
# compiler identifier
CC=g++
# compiler options
CFLAGS=-c -Wall
SRC_DIR := src
INC_DIR := include
LIB_DIR := lib
BUILD_DIR := build
BIN_DIR := bin
MODULES := main xml
SRC_DIRS := $(addprefix $(SRC_DIR)/,$(MODULES))
SRC_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c))
OBJ_FILES := $(patsubst $(SRC_DIR)/%,$(BUILD_DIR)/%,$(SRC_FILES:.c=.o))
OBJ_DIRS := $(patsubst $(SRC_DIR)/%,$(BUILD_DIR)/%,$(SRC_DIRS))
.PHONY: all clean
all : clean main
main: $(OBJ_FILES)
$(CC) $^ -o $(BIN_DIR)/$@
$(OBJ_FILES) :
$(CC) $(CFLAGS) $(INC_MOD) $(INC) $(patsubst $(BUILD_DIR)/%, $(SRC_DIR)/%, $(patsubst %.o, %.c, $@)) -o $@
clean: $(OBJ_DIRS)
$(OBJ_DIRS):
mkdir $@
del $@\* /f /q
print-% : ; @echo $* = $($*)
现在,它可以工作,但我很确定以下行不是100%正确:
$(OBJ_FILES) :
$(CC) $(CFLAGS) $(INC_MOD) $(INC) $(patsubst $(BUILD_DIR)/%, $(SRC_DIR)/%, $(patsubst %.o, %.c, $@)) -o $@
这基本上是一个解决方法,因为mingw32-make似乎不支持这样的模式规则:
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
主要问题是:还有其他人有同样的问题吗? 有人可以表明更好的实施吗?谢谢。