带有 Build 和 Source 子目录的 Makefile

Posted

技术标签:

【中文标题】带有 Build 和 Source 子目录的 Makefile【英文标题】:Makefile with Build and Source Sub-Directories 【发布时间】:2014-05-09 18:17:27 【问题描述】:

我正在尝试应用this 和this 来设置一个makefile 来编译一个C++ 程序,以便目标文件进入一个特定的目录并且源文件位于它们自己单独的目录中。主文件夹有三个子文件夹 test(有一些我要编译的 cpp 文件)、include(有一些测试使用的头文件)和 build(我希望 .o 文件所在的空文件夹)。

这是制作文件。

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 放在测试文件夹中。注释代码(而不是上面的代码)改编自上面的链接,以尝试将 .o 放在构建目录中。但是,我得到了错误

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 部分正常工作。

【问题讨论】:

build/armadillo_extra_functions_test.o 实际上的预期来源是什么?可能正在设置vpath 帮助... @πάνταῥεῖ 例如,我可能有 test/armadillo_extra_functions_test.cpp。这将包含在 SRC 命令中。我想将目标文件编译为 build/armadillo_extra_functions_test.o。如果不包含 cmets,它可以找到 test/armadillo_extra_functions_test.cpp 文件并将其编译为 test/armadillo_extra_functions_test.o。我不确定 vpath 是否会因此有所帮助,但我真的不知道。 @πάνταῥεῖ 我刚刚添加了VPATH = $(SRC_DIR) 并编译了它。谢谢! 【参考方案1】:

设置内部 make 变量 VPATH 应该有助于找到 'out of source tree builds'的源。就这样设置吧:

VPATH = $(SRC_DIR)

【讨论】:

以上是关于带有 Build 和 Source 子目录的 Makefile的主要内容,如果未能解决你的问题,请参考以下文章

CMake PROJECT_SOURCE_DIR变量(使用project()命令指定项目名称时,CMakeLists.txt所在路径)PROJECT_BINARY_DIR变量,根目录下build目录

build-helper-maven-plugin 简单讲解

build-helper-maven-plugin 简单讲解

build-helper-maven-plugin 简单讲解

build-helper-maven-plugin 简单讲解

android8.1 source build/envsetup.sh分析 增加删除lunch