MINGW32-MAKE:*** 没有规则可以创建“module.dll”所需的目标“*.cpp.o”。停止

问题描述 投票:0回答:1

我正在尝试使用 makefile 将 C 和 C++ 文件编译成 DLL,但每当我构建时,我都会收到错误 MINGW32-MAKE: *** Norule to make target 'vendor\whatever*.cpp.o', need by '模块.dll'。 停下来。

主源文件夹中的所有文件都可以正确编译。

我很确定问题在于如何使用 patsubst 和 subst 获取所有 .o 文件,但我不确定如何修复它。

我知道这很愚蠢,但我以前从未使用过 makefile。

.PHONY: build clean mkdir run print

CC     := gcc.exe
CXX    := g++.exe

CWD    := $(subst \,/,$(shell cd))
SRCDIR := $(CWD)/src
INCDIR := $(CWD)/inc
BINDIR := $(CWD)/build

SRC_C   := $(shell dir /a:-d /b/s $(shell cd)\src\\*.c)
SRC_C   := $(subst \,/,$(SRC_C))
CCFLAGS := -O2 -I "$(CWD)/vendor" -I "$(CWD)/inc"

LDLIBS  := -lws2_32 -lkernel32 -luser32 -ldwmapi -ld3d11 -ldxgi -ldxguid -lgid32 -ld3dcompiler
LDFLAGS := -s -shared -mconsole -static-libgcc -static-libstdc++
EXE     := module.dll

OBJECTS := $(SRC_C)
OBJECTS := $(subst \,/,$(OBJECTS))
OBJECTS := $(subst /src,,$(patsubst $(CWD)/%.c,$(BINDIR)/int/%.c.o,$(OBJECTS)))

build: $(EXE)

$(EXE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@ $(LDLIBS)

$(CWD)/int/%.c.o: $(SRC_C)/%.c
    $(shell echo $<)
    $(CC) -c -std=c99 $(CCFLAGS) -o $< $@

编辑:简化了具有相同问题的 makefile

windows makefile gnu-make
1个回答
0
投票

所以经过几个小时的测试后我自己修复了它。

我拿了一个模板makefile并修改它以满足我的需要

.DEFAULT_GOAL = build

CC  = gcc
CXX = g++
LD  = g++

CCFLAGS = -O2 -I"vendor" -I"inc"
LDFLAGS = -s -shared -mconsole -static-libgcc -static-libstdc++
LDLIBS  = 

ifeq ($(RENDERER),d3d11)
    CCFLAGS := $(CCFLAGS) -DRENDERER_USE_DIRECTX11
    LDLIBS  := $(LDLIBS) -ld3d11 -ldxgi -ldxguid -ld3dcompiler
endif
ifeq ($(RENDERER),d3d12)
    CCFLAGS = $(CCFLAGS) -DRENDERER_USE_DIRECTX12
endif
ifeq ($(RENDERER),glfw)
    CCFLAGS := $(CCFLAGS) -DRENDERER_USE_GLFW
endif

SRCDIR = src
SRC_FILES := $(subst \,/, $(shell dir /a:-d /b/s $(shell cd)\src\\*.c)) $(subst \,/, $(shell dir /a:-d /b/s $(shell cd)\src\\*.cc))

ifeq ($(BACKEND),imgui)
    SRC_FILES := $(SRC_FILES) $(subst \,/, $(shell dir /a:-d /b/s vendor\imgui\src\*.cpp))
    CCFLAGS   := $(CCFLAGS) -DRENDERER_USE_IMGUI
    LDLIBS    := $(LDLIBS) -lgdi32 -luser32 -ldwmapi
endif
ifeq ($(BACKEND),nuklear)
    SRC_FILES := $(SRC_FILES) $(subst \,/, $(shell dir /a:-d /b/s vendor\nuklear\src\*.c))
    CCFLAGS += -DRENDERER_USE_NUKLEAR
endif
SRC_FILES := $(subst $(subst \,/,$(shell cd))/,, $(SRC_FILES))

INTDIR = build/int
INT_FILES := $(SRC_FILES)
INT_FILES := $(patsubst %.cc, $(INTDIR)/%.o, $(INT_FILES))
INT_FILES := $(patsubst %.c, $(INTDIR)/%.o, $(INT_FILES))
INT_FILES := $(patsubst %.cpp, $(INTDIR)/%.o, $(INT_FILES))
INT_FILES := $(subst src/,, $(INT_FILES))

OUTDIR = build/bin
OUT_FILE = module.dll

.PHONY: test
test:
    @echo $(SRC_FILES)
    @echo $(INT_FILES)

.PHONY: clean
clean:
    $(RM) $(INT_FILES)
    $(RM) $(OUTDIR)/$(EXE)

.PHONY: build
build: $(OUTDIR)/$(OUT_FILE)

$(OUTDIR)/$(OUT_FILE): $(INT_FILES)
     $(LD) $(LDFLAGS) $(INT_FILES) -o $@ $(LDLIBS)

$(INTDIR)/%.o:  $(SRCDIR)/%.c
    $(CC) $(CCFLAGS) -c -o $@ $<
$(INTDIR)/%.o:  $(SRCDIR)/%.cc
    $(CXX) $(CCFLAGS) -c -o $@ $<
$(INTDIR)/%.o:  $(SRCDIR)/%.cpp
    $(CXX) $(CCFLAGS) -c -o $@ $<

$(INTDIR)/vendor/nuklear/%.o:   vendor/nuklear/src/%.cpp
    $(CC) $(CCFLAGS) -c -o $@ $<

$(INTDIR)/vendor/imgui/%.o: vendor/imgui/src/%.cpp
    $(CXX) $(CCFLAGS) -c -o $@ $<

-include $(DEPENDS)

我知道它的代码可能很糟糕,但它确实有效:p

© www.soinside.com 2019 - 2024. All rights reserved.