【问题标题】:How to output .o files into one specific folder?如何将 .o 文件输出到一个特定的文件夹中?
【发布时间】:2021-02-04 06:49:49
【问题描述】:

我目前正在使用 MinGW64、G++ 和 makefile 在 VSCode 上编译我的 c++ 项目。我有两个 src 目录 srcsrc/vendor/imGui 包含我编译的 .cpp 文件。到目前为止,makefile 能够编译这两个 src 文件夹。但是,.o 文件在其各自的 src 文件夹中输出。如何使生成的每个 .o 文件都发送到一个特定的文件夹/目录?

当前的 Makefile:

CXX = g++

CXXFLAGS    := -std=c++17 -Wall -Wextra -g

LFLAGS += -LC:/mingw64/x86_64-w64-mingw32/bin
LFLAGS += -LC:/mingw64/x86_64-w64-mingw32/lib

OUTPUT  := output

SRC     := src
SRC     += src/vendor/imGui

INCLUDE := include

LIB     := lib

ifeq ($(OS),Windows_NT)
MAIN    := main.exe
SOURCEDIRS  := $(SRC)
INCLUDEDIRS := $(INCLUDE)
LIBDIRS     := $(LIB)
FIXPATH = $(subst /,\,$1)
RM          := del /q /f
MD  := mkdir
else
MAIN    := main
SOURCEDIRS  := $(shell find $(SRC) -type d)
INCLUDEDIRS := $(shell find $(INCLUDE) -type d)
LIBDIRS     := $(shell find $(LIB) -type d)
FIXPATH = $1
RM = rm -f
MD  := mkdir -p
endif

INCLUDES    := $(patsubst %,-I%, $(INCLUDEDIRS:%/=%))
INCLUDES    += -IC:/Users/kimda/Desktop/Projects/C++/Libraries/glm
INCLUDES    += -IC:/mingw64/x86_64-w64-mingw32/include
INCLUDES    += -IC:/Users/kimda/Desktop/Projects/C++/OpenGL/src/vendor/imGui

LIBS        := $(patsubst %,-L%, $(LIBDIRS:%/=%))
LIBS        += -lglew32
LIBS        += -lopengl32
LIBS        += -lglfw3
LIBS        += -lgdi32
LIBS        += -lglu32

SOURCES     := $(wildcard $(patsubst %,%/*.cpp, $(SOURCEDIRS)))

OBJECTS     := $(SOURCES:.cpp=.o)

OUTPUTMAIN  := $(call FIXPATH,$(OUTPUT)/$(MAIN))

all: $(OUTPUT) $(MAIN)
    @echo Building complete!
    

$(OUTPUT):
    @$(MD) $(OUTPUT)

$(MAIN): $(OBJECTS) 
    @$(CXX) $(CXXFLAGS) $(INCLUDES) -o $(OUTPUTMAIN) $(OBJECTS) $(LFLAGS) $(LIBS)

.cpp.o:
    @$(CXX) $(CXXFLAGS) $(INCLUDES) -c $<  -o $@

.PHONY: clean
clean:
    @$(RM) $(OUTPUTMAIN)
    @$(RM) $(call FIXPATH,$(OBJECTS))
    @echo Cleanup complete!

run: clean all
    @./$(OUTPUTMAIN)
    @echo Executing complete!

【问题讨论】:

    标签: c++ makefile g++ mingw-w64


    【解决方案1】:

    如果我理解正确,您希望将所有目标文件发送到某个“构建”目录。 我通常会这样做

    BUILDDIR := build
    
    [...]
    
    OBJECTS := $(addprefix $(BUILDDIR)/,$(SOURCES:.cpp=.o))
    
    [...]
    

    然后改变你的

    .cpp.o:
        @$(CXX) $(CXXFLAGS) $(INCLUDES) -c $<  -o $@
    

    $(BUILDDIR)/%.o: %.cpp
        @$(MD) $(dir $@)
        @$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
    

    【讨论】:

    • 我尝试了您的建议,现在当我运行命令 make clean 时出现此错误:The system cannot find the file specified. 用于 @$(RM) $(call FIXPATH,$(OBJECTS)) 行。此外,当我运行命令 make 时,它会出现此错误:The syntax of the command is incorrect. for the @$(MD) $(dir $@) 行。
    • clean 目标现在可以简化为 rm build
    • 对于不正确的语法:检查缩进是否一致,然后去掉@,看看它也试图扩展它
    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2019-06-20
    • 1970-01-01
    相关资源
    最近更新 更多