所以我有以下文件夹结构
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.
答案 0 :(得分:2)
您的第二个错误是因为删除了目标中的%
,您已将其转换为显式规则,而不是模式规则。因此,先决条件中的%
不会被替换。
您的第一个错误意味着由于某种原因,make决定您的模式规则不匹配。通常,这意味着make无法找到并且不知道如何创建其中一个先决条件。我建议你使用-d
标志运行make,看看为什么决定你的规则不适用。
您使用的是什么版本的GNU make?如果要放置目标的目录不存在,则某些非常旧的版本将不匹配模式规则。
答案 1 :(得分:0)
问题是标题丢失......我身边的愚蠢错误。
我忽略了它,因为这是一个较长的makefile的片段,它应该复制在标题上,但并不意味着这行输出了错误。愚蠢的我......