我正在尝试整理一个makefile,它将从目录中获取源文件(例如src
),将它们编译成另一个目录中的目标文件(例如。build
),然后获取这些文件并在主目录中创建一个静态库。
到目前为止,这是我的努力:
LIBNAME := test
LIBNAME := lib$(LIBNAME).a
CC = g++
CFLAGS := -O0 -Wall -g -fPIC
INCLUDE := include
SOURCE := src
BUILD := build
CPPFILES := $(foreach dir, $(SOURCE)/, $(notdir $(wildcard $(SOURCE)/*.cpp)))
OBJFILES := $(addprefix $(BUILD)/, $(CPPFILES:.cpp=.o))
all: $(LIBNAME) $(OBJFILES)
$(LIBNAME): $(OBJFILES)
ar rcs $(LIBNAME) $(OBJFILES)
.cpp.o:
$(CC) $(CFLAGS) -I$(INCLUDE) -c $< -o $@
clean:
rm -rf $(BUILD)
这给了我这个:
make: *** No rule to make target `build/point.o', needed by `libtest.a'. Stop
答案 0 :(得分:3)
你似乎确实要求GNU make(foreach函数),所以重写旧式后缀规则.cpp.o到
$(BUILD)/%.o : $(SOURCE)/%.cpp
应该做的伎俩。您也可以尝试使用VPATH变量或vpath指令,请参阅make manual。
一般情况下,您可能只是使用automake
解决此问题,{{1}}会为您完成大部分内容。