我正在尝试应用this和this来设置makefile以编译C ++程序,以便目标文件转到特定目录,并且源文件位于各自的目录中。主文件夹有三个子文件夹测试(有一些我要编译的cpp文件),include(有测试使用的一些头文件)和build(我希望.o文件去的空文件夹)。
这是make文件。
CC = g++
CFLAGS = -g -Wall
INC_DIR1 = include
INC_DIR2 = C:/armadillo-4.200.0/include
INC_DIR = $(INC_DIR1) $(INC_DIR2)
INCLUDES = $(foreach d, $(INC_DIR), -I$d)
BUILD_DIR = build
SRC_DIR = test
SRC = $(wildcard */*.cpp)
OBJS = $(SRC:.cpp=.o)
#OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(SRC:.cpp=.o)))
#create objects as the build directory plus the non-directory component of
#source
MAIN = armadillo_extra_functions_test
.PHONY: depend clean
all: $(BUILD_DIR) $(MAIN)
@echo amradillo_extra_functions_test has been compiled
$(BUILD_DIR):
mkdir -p $@
%.o: %.cpp
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
#$(BUILD_DIR)/%.o: %.cpp
# $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
#put .os in build directory instead of test.
$(MAIN): $(OBJS)
$(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS)
clean:
$(RM) *.o *~ $(MAIN) $(BUILD_DIR)/*.o $(SRC_DIR)/*.o
depend: $(SRC)
makedepend $(INCLUDES) $^
上面的代码编译成功,exe工作正常。但是,它将.cpps放在test文件夹中。评论代码(而不是上面的代码)从上面的链接改编,试图将.o&#s放在构建目录中。但是,我收到了错误
make: *** No rule to make target 'build/armadillo_extra_functions_test.o', neede
d by 'armadillo_extra_functions_test'. Stop.
当我从代码的第一个版本中获取.o文件时,将它们放在build文件夹中,删除exe,然后运行注释版本,编译得很好。
因此,我认为该问题与%.o:%。cpp部分有关。 .o文件的名称类似于/build/blah.o,源文件的名称类似于/test/blah.cpp。我尝试了几种不同的组合,例如上面的前缀版本与$(BUILD_DIR)/%。o:%。cpp和没有,但没有运气。
我不想依赖添加移动命令到make文件,而是希望%。o:%。cpp部分正常工作。