gpt4 book ai didi

c++ - Makefile:将对象编译到不同的目录并从那里构建

转载 作者:行者123 更新时间:2023-11-28 04:50:44 24 4
gpt4 key购买 nike

我的生成文件:

CXX = clang++
CXXFLAGS = -g -Wall -std=c++14
LDFLAGS = -lboost_system -lcrypto -lssl -lcpprest -lpthread

OBJDIR = obj
SRCDIR = .

SRC := $(shell find $(SRCDIR) -name "*.cpp")
OBJ := $(SRC:%.cpp=%.o)

APP = run

all: $(APP)

$(APP): $(OBJ)
@echo "== LINKING EXECUTABLE $(APP)"
@$(CXX) $^ $(LDFLAGS) -o $(APP)

%.o: %.cpp
@echo "COMPILING SOURCE $< INTO OBJECT $@"
@$(CXX) -c $(CXXFLAGS) $< -o $@

clean:
find . -name *.o -delete
rm -f $(APP)

目录结构:

Makefile
sources/
directory1
...cpp
directory2
...cpp
...
main.cpp
obj/

我尝试制作 make创建 *.o目录中的文件 obj/然后从那里编译最终的可执行文件。我尝试了各种方法,但由于存储 *.cpp 的项目结构而失败了子目录中的文件。特别是,我尝试了以下方法:https://stackoverflow.com/a/26032630/2042546我还尝试操纵命令本身 clang++ $< -o obj/$@但它打破了 make 的整个想法,它是依赖管理。

如果我通过 patsubstr 修改 OBJ和 notdir , make 无法推断出对 *.o 的依赖在相应的 *.cpp 上通过它的路径,导致*.o的路径丢失了它的目录部分,变得无法找到它的 *.cpp执行时的文件 %.o:%.cpp规则(我希望我能正确地写下我的想法)。

最佳答案

如果您希望对象位于相同的源目录结构中但位于 obj 下,那么只需更改您的模式规则(以及生成对象文件的方式)。你应该先创建目录:

OBJ := $(SRC:%.cpp=$(OBJDIR)/%.o)
...
$(OBJDIR)/%.o: %.cpp
@echo "COMPILING SOURCE $< INTO OBJECT $@"
@mkdir -p '$(@D)'
@$(CXX) -c $(CXXFLAGS) $< -o $@

关于c++ - Makefile:将对象编译到不同的目录并从那里构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48267813/

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