gpt4 book ai didi

c - Makefile 找不到已经存在的目标

转载 作者:行者123 更新时间:2023-12-02 06:11:26 25 4
gpt4 key购买 nike

所以我有以下文件夹结构

makefile
src/my_lib.c
src/myhead.h

我正在尝试将 *my_lib.c* 与标题 myhead.h 编译为库。这是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.

最佳答案

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

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

您使用的是哪个版本的 GNU make?如果目标要放入的目录尚不存在,则某些非常旧的版本将无法匹配模式规则。

关于c - Makefile 找不到已经存在的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20411433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com