我一直在研究使用make构建cpp应用程序并在线查看各种资源。当它起作用时,我正在尝试构建目标文件并将其放置在特定目录中,而不是将它们与源文件放入相同的src /中。理想情况下,我希望它们进入OUT_O_DIR位置,但是它们是生成并放置在src /中的,这是我不希望的。
我想要这样的结构:
.
|- Makefile
|- include/
| |- *.h
|- src/
| |- *.c
|- output/
| |- App
|- obj/
| |- *.o
我的版本:
GNU Make 4.1
Built for x86_64-pc-linux-gnu
我的Makefile:
OUT_O_DIR := $(OUT_DIR)/obj
PROJ = hello
SOURCE = $(wildcard src/*.cpp)
INC = $(wildcard include/*.h)
OBJS = $(SOURCE:.cpp=.o)
CFLAGS = -I include
CC = g++
.PHONY: directories
all : directories $(OUT_DIR)$(PROJ)
directories: $(OUT_DIR)
$(OUT_DIR)$(PROJ) : $(OBJS)
$(CC) -o $@ $(OBJS)
.cpp.o: $(INC)
@echo $@
$(CC) -c $(CFLAGS) $< -o $@
clean :
rm -rf $(OUT_DIR)
$(OUT_DIR):
mkdir -p $(OUT_DIR)
'。cpp.o'不能扩展到涵盖多个文件夹。两个选项
修改OBJS和规则以构建对象。
#OBJS = $(SOURCE:.cpp=.o)
OBJS = $(SOURCE:src/%.cpp=$(OUT_O_DIR)/%.o)
...
#.cpp.o: $(INC)
${OUT_O_DIR}/%.o: src/%.cpp $(INC)
$(CC) -c $(CFLAGS) $< -o $@
或使用vpath指定.cpp文件位于src中
#OBJS = $(SOURCE:.cpp=.o)
OBJS = $(SOURCE:src/%.cpp=$(OUT_O_DIR)/%.o)
vpath %.cpp src
${OUT_O_DIR}/%.o: %.cpp $(INC)
$(CC) -c $(CFLAGS) $< -o $@