【问题标题】:Makefile: compile objects to different directory and build from thereMakefile:将对象编译到不同的目录并从那里构建
【发布时间】: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++ $&lt; -o obj/$@,但它打破了 make 的整个想法,它是依赖管理。

如果我通过patsubstrnotdir 修改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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2020-12-24
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多