Makefile找不到已存在的目标

时间:2013-12-05 21:45:23

标签: c makefile

所以我有以下文件夹结构

makefile
src/my_lib.c
src/myhead.h

我正在尝试使用标题 myhead.h 编译* my_lib.c *作为库。这是 makefile 。我尝试将 obj 文件放在 OBJFOLDER 中,将编译后的库放在 OUTPUTFOLDER

PLUGNAME=my_lib

SOURCEFOLDER=src
OUTPUTFOLDER=bin
OBJFOLDER=bin/obj

OBJS=$(PLUGNAME).o
DEPS=myhead.h

# Configuration finishes here

_OBJS = $(patsubst %,$(OBJFOLDER)/%,$(OBJS))
_DEPS = $(patsubst %,$(SOURCEFOLDER)/%,$(DEPS))

ifeq ($(OS),Windows_NT)
    EXT = .dll
else
    UNAME_S := $(shell uname -s)
    ifeq ($(UNAME_S),Linux)
        EXT = .so
    endif
endif

all : $(OUTPUTFOLDER)/$(PLUGNAME)$(EXT)

$(OUTPUTFOLDER)/$(PLUGNAME)$(EXT) : $(_OBJS)
    gcc -Wl,--add-stdcall-alias -shared -o $@ $(_OBJS)

$(OBJFOLDER)/%.o: $(SOURCEFOLDER)/%.c $(_DEPS)
    mkdir -p $(OUTPUTFOLDER)
    mkdir -p $(OBJFOLDER)
    gcc $(foreach d, $(INC), -I$d) -c $< -o $@

.PHONY: clean

clean :
    rm -f $(OBJFOLDER)/*.o $(OUTPUTFOLDER)/$(PLUGNAME)$(EXT)                             $(SOURCEFOLDER)/TSDRPlugin.h

当我使所有失败时

make: *** No rule to make target `bin/obj/my_lib.o', needed by `bin/
my_lib.dll'.  Stop.

我不知道这是怎么可能的,因为我已经定义了

 $(OBJFOLDER)/%.o: $(SOURCEFOLDER)/%.c $(_DEPS)

奇怪的是,如果我将 makefile 中的上一行更改为

 bin/obj/my_lib.o: $(SOURCEFOLDER)/%.c $(_DEPS)

我现在得到了

 make: *** No rule to make target `src/%.c', needed by `bin/obj/my_lib.o'.  Stop.

2 个答案:

答案 0 :(得分:2)

您的第二个错误是因为删除了目标中的%,您已将其转换为显式规则,而不是模式规则。因此,先决条件中的%不会被替换。

您的第一个错误意味着由于某种原因,make决定您的模式规则不匹配。通常,这意味着make无法找到并且不知道如何创建其中一个先决条件。我建议你使用-d标志运行make,看看为什么决定你的规则不适用。

您使用的是什么版本的GNU make?如果要放置目标的目录不存在,则某些非常旧的版本将不匹配模式规则。

答案 1 :(得分:0)

问题是标题丢失......我身边的愚蠢错误。

我忽略了它,因为这是一个较长的makefile的片段,它应该复制在标题上,但并不意味着这行输出了错误。愚蠢的我......