带有构建和源子目录的Makefile

时间:2014-05-09 18:17:27

标签: c++ gcc makefile

我正在尝试应用thisthis来设置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部分正常工作。

1 个答案:

答案 0 :(得分:2)

设置内在的make变量VPATH应该有助于从源代码树构建中找到'的源代码。只需设置如下:

VPATH = $(SRC_DIR)