对象文件与其他文件的依赖关系不为';我的C makefile无法工作

对象文件与其他文件的依赖关系不为';我的C makefile无法工作,c,makefile,compiler-errors,dependencies,shared-libraries,C,Makefile,Compiler Errors,Dependencies,Shared Libraries,我需要创建一个文件,为ds文件夹中的所有数据结构构建目标。共享对象&每个与共享对象链接并运行的练习的可执行测试文件 以下是我的.c和.o文件层次结构: ds \ source \ stack.c, queue.c, cbuffer.c include \ stack.h, queue.h, cbuffer.h test \ stack_test.c, queue_test.c, cbuffer_test.c

我需要创建一个文件,为ds文件夹中的所有数据结构构建目标。共享对象&每个与共享对象链接并运行的练习的可执行测试文件

以下是我的.c和.o文件层次结构:

ds
  \

  source
   \
        stack.c, queue.c, cbuffer.c

  include
   \
        stack.h, queue.h, cbuffer.h

  test
   \
        stack_test.c, queue_test.c, cbuffer_test.c

  obj
     \
       stack.o stack.d stack_test.o queue.o queue.d queue_test.o cbufer.o cbuffer.d cbuffer_test.o
这就是目前有效的方法。 但是我试图创建一个依赖项,并且仅当
.c
文件或
.h
文件已更改时,才创建新的
o.files

现在,它创建了
makeall
maketest
,即使我没有更改任何文件。我可以随时运行它,尽管我没有更改任何文件,但它仍然可以编译所有内容

#PATHS
SRCDIR=./source/
TSTDIR=./test/
OBJDIR=./obj/
HDRDIR=./include/
#vpaths
vpath %.h ./include/
vpath %.c ./test/
vpath %.c ./source/
vpath %.o ./obj/
vpath %.d ./obj/
#COMPILER
CC=gcc
CFLAGS=-ansi -pedantic-errors -Wall -Wextra -fpic -g -I$(HDRDIR) # C flags
LDFLAGS=-L./ -Wl,-rpath=./ # linking flags
TARGET_LIB = libds.so  # target lib
LDLIBS=-lds
#FILES
TESTS=$(wildcard ./test/*.c)
CFILESWP=$(patsubst %_test.c,%.c,$(TESTS))
SRCS=$(notdir $(CFILESWP))
TARGETS=$(patsubst %.c,%,$(SRCS))
SRCOBJS=$(SRCS:.c=.o)
TSTOBJS=$(TESTS:.c=.o)
HFILES=$(SRCS:.c=.h)

.PHONY: all clean

# build shared objects
all: ${TARGET_LIB} 
# build executable (ELF) files with dubged shared object 
test: $(TARGETS)

#CREATE EXECUTABLES
$(TARGETS): $(TSTOBJS)
    $(CC) $(CFLAGS) $(LDFLAGS) $(TSTDIR)$@_test.o -o $@ $(LDLIBS)
    mv $(TSTDIR)$@_test.o $(OBJDIR)
    
#CREATE A SHARED LIBRARY
$(TARGET_LIB): $(SRCOBJS) $(HFILES)
    $(CC) -shared -o $@ $^
    mv *.o $(OBJDIR)
    
$(SRCS:.c=.d):%.d:%.c %.h
    $(CC) $(CFLAGS) -MM $< >$@
    mv *.d $(OBJDIR)
    
$(TESTS:.c=.d):%.d:%.c $(TARGETS).h
    $(CC) $(CFLAGS) -MM $< >$@
    
#%.d:%.c
#   $(CC) $(CFLAGS) -MM $< >$@
    
-include $(SRCS:.c=.d)

#CLEAN
clean:
    rm -f $(OBJDIR)*.o $(OBJDIR)*.d
    rm -f $(TARGETS) libds.so
#路径
SRCDIR=/源/
TSTDIR=/试验/
OBJDIR=/obj/
HDRDIR=/包括/
#虚拟路径
v路径%.h./include/
vpath%.c./test/
vpath%.c./source/
v路径%.o./obj/
v路径%.d./obj/
#编译程序
CC=gcc
CFLAGS=-ansi-pedantic errors-Wall-Wextra-fpic-g-I$(HDRDIR)#C标志
LDFLAGS=-L./-Wl,-rpath=./#链接标志
TARGET_LIB=libds.so#TARGET LIB
LDLIBS=-lds
#档案
测试=$(通配符。/test/*.c)
CFILESWP=$(patsubst%\u test.c、%.c、$(TESTS))
SRCS=$(notdir$(CFILESWP))
目标=$(patsubst%.c、%、$(SRC))
SRCOBJS=$(SRCS:.c=.o)
TSTOBJS=$(测试:.c=.o)
HFILES=$(SRCS:.c=.h)
.骗子:都是干净的
#构建共享对象
全部:${TARGET_LIB}
#使用配音共享对象生成可执行(ELF)文件
测试:$(目标)
#创建可执行文件
$(目标):$(TSTOBJS)
$(CC)$(CFLAGS)$(LDFLAGS)$(TSTDIR)$@@u test.o-o$@$(LDLIBS)
mv$(TSTDIR)$@_test.o$(OBJDIR)
#创建共享库
$(目标库):$(SRCOBJS)$(HFILES)
$(CC)-共享-o$@$^
mv*.o$(OBJDIR)
$(SRCS:.c=.d):%.d:%.c%.h
$(CC)$(CFLAGS)-MM$<>$@
mv*.d$(OBJDIR)
$(测试:.c=.d):%.d:%.c$(目标).h
$(CC)$(CFLAGS)-MM$<>$@
#%d.d:%
#$(CC)$(CFLAGS)-MM$<>$@
-包括$(SRCS:.c=.d)
#干净的
清洁:
rm-f$(OBJDIR)*.o$(OBJDIR)*.d
rm-f$(目标)libds.so
我希望它运行
make all
,仅当
.h
文件或
.c
文件中的一个文件已更改时,才重新创建库。即使如此,它也只会链接更改文件的新头文件和c文件

对于
maketest

也一样,您可以使用选项
-d
运行“make”,查看它决定重建内容的原因。-您的规则处理主目录中的目标,并在目标目录中构建后移动它们。因此,从逻辑上讲,在每次重复运行make时,它都必须重建它们,因为目标被移动,因此丢失。-研究如何编写生成文件,直接在目录中构建目标。