gpt4 book ai didi

c++ - 包含构建和源代码子目录的 Makefile

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:32 26 4
gpt4 key购买 nike

我正在尝试申请 thisthis设置 makefile 来编译 C++ 程序,以便目标文件进入特定目录,并且源文件位于它们自己的单独目录中。主文件夹有三个子文件夹 test(有一些我想编译的 cpp 文件)、include(有一些测试使用的 header )和 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 文件,将它们放在构建文件夹中,删除 exe,并运行注释版本时,它编译得很好。

因此,我认为问题与 %.o: %.cpp 部分有关。 .o 文件的名称类似于/build/blah.o,而源文件的名称类似于/test/blah.cpp。我尝试了几种不同的组合,例如上面带有 $(BUILD_DIR)/%.o: %.cpp 和没有的前缀版本,但没有成功。

我不想依赖于向 make 文件添加移动命令,而是希望让 %.o:%.cpp 部分正常工作。

最佳答案

设置内部 make 变量 VPATH应该有助于找到“源代码树之外的构建” 的来源。只需这样设置:

VPATH = $(SRC_DIR)

关于c++ - 包含构建和源代码子目录的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23571462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com