我正在尝试使用 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
所以经过几个小时的测试后我自己修复了它。
我拿了一个模板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