错误的Makefile会导致未定义的引用和多个定义错误

错误的Makefile会导致未定义的引用和多个定义错误,makefile,gnu-make,Makefile,Gnu Make,我正在研究Makefiles的奇妙世界,这是我第一次尝试自己的makefile。然而,我的小脑袋撞上了一堵墙,出现了错误,我无法找出原因,我只知道问题出在Makefile中,我做错了什么,因为当我手动编译我的“项目”时,它会编译 cxx := g++ dirs := obj bld_win32 bld_linux cpp := $(wildcard src/*.cpp) obj := $(addprefix obj/,$(notdir $(cpp:.cpp=.o))) ifeq ($(OS),

我正在研究Makefiles的奇妙世界,这是我第一次尝试自己的makefile。然而,我的小脑袋撞上了一堵墙,出现了错误,我无法找出原因,我只知道问题出在Makefile中,我做错了什么,因为当我手动编译我的“项目”时,它会编译

cxx := g++
dirs := obj bld_win32 bld_linux
cpp := $(wildcard src/*.cpp)
obj := $(addprefix obj/,$(notdir $(cpp:.cpp=.o)))

ifeq ($(OS), Windows_NT)
    target := bld_win32/engine.exe
    flags := -mwindows -lopengl32 -openal32 -lgdi32
else
    target := bld_linux/engine
    flags := -lX11 -lGL -lopenal -lalut
endif

all: precheck $(target)

precheck:
    mkdir -p $(dirs)

$(target): $(obj)
    $(cxx) -std=c++11 -Wall -o $@ $^ $(flags)

obj/%.o: $(cpp)
    $(cxx) -c -o $@ $<
cxx:=g++
目录:=obj bld_win32 bld_linux
cpp:=$(通配符src/*.cpp)
obj:=$(addprefix obj/,$(notdir$(cpp:.cpp=.o)))
ifeq($(操作系统),Windows\u NT)
目标:=bld_win32/engine.exe
标志:=-mwindows-lopengl32-openal32-lgdi32
其他的
目标:=bld_linux/engine
标志:=-lX11-lGL-lopenal-lalut
恩迪夫
全部:预检查$(目标)
预检查:
mkdir-p$(dirs)
$(目标):$(obj)
$(cxx)-std=c++11-Wall-o$@$^$(标志)
obj/%.o:$(cpp)
$(cxx)-c-o$@$<

您的模式规则是错误的,如果您尝试使用此makefile逐个构建对象文件,您会注意到这一点。这条规则:

obj/%.o: $(cpp)
    $(cxx) -c -o $@ $<

是的,我真傻,我忘了手动测试编译对象。多谢各位!
obj/%.o: src/%.cpp
   $(cxx) -c -o $@ $<