【发布时间】:2018-01-15 17:16:49
【问题描述】:
我的 Makefile:
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 在目录obj/ 中创建*.o 文件,然后从那里编译最终的可执行文件。我尝试了各种方法,但由于将*.cpp 文件存储在子目录中的项目结构而失败了。特别是,我尝试了以下方法:https://stackoverflow.com/a/26032630/2042546
我也尝试过操纵命令本身clang++ $< -o obj/$@,但它打破了 make 的整个想法,它是依赖管理。
如果我通过patsubstr 和notdir 修改OBJ,make 将无法通过其路径推断*.o 对相应*.cpp 的依赖关系,导致*.o 的路径丢失其目录部分并变为执行%.o:%.cpp 规则时找不到它的*.cpp 文件(我希望我能正确地写下我的想法)。
【问题讨论】:
-
您的问题不清楚。您希望将对象创建为
obj/foo.o obj/bar.o obj/main.o都在同一目录中吗?还是要将它们创建为obj/directory1/foo.o obj/directory2/bar.o obj/main.o,以便将源文件目录结构保留在obj目录中? -
@MadScientist 后者 (
obj/directory1/foo.o) 因为它可以正确处理同名文件。我想我以前从未想过。
标签: c++ makefile subdirectory