C 使不按预期工作

C 使不按预期工作,c,makefile,C,Makefile,我试图创建一个Makefile来简化我的工作,但似乎我做错了什么。。下面是项目文件的内容: 工作空间 这就是我的项目的样子,在我运行make之后,它没有按预期工作,我无法找出我的Makefile有什么问题 arubu@CQ56-LinuxMachine:here$ make make: *** No rule to make target `bin/src/lib/lib.o', needed by `main'. Stop. arubu@CQ56-LinuxMachine:here$ ls

我试图创建一个Makefile来简化我的工作,但似乎我做错了什么。。下面是项目文件的内容:

工作空间 这就是我的项目的样子,在我运行
make
之后,它没有按预期工作,我无法找出我的
Makefile
有什么问题

arubu@CQ56-LinuxMachine:here$ make
make: *** No rule to make target `bin/src/lib/lib.o', needed by `main'.  Stop.
arubu@CQ56-LinuxMachine:here$ ls
bin  Makefile  Makefile~  src
arubu@CQ56-LinuxMachine:here$ 
任何人都可以看一看,告诉我问题是什么,以及如何解决它

生成文件
#
CC=gcc
RM=RM
EXEC=main
# #
SRCDIR=src
OBJDIR=bin
# #
SRCS:=$(shell查找$(SRCDIR)-名称'*.c')
SRCDIRS:=$(shell find.-name'*.c'-exec dirname{}\|uniq)
OBJS:=$(patsubst%.c,$(OBJDIR)/%.o,$(SRCS))
OBJ=#main.o lib.o
DEPS=lib.h
# #
CFLAGS=-I.-Wall-std=c99-保存临时数据
LDFLAGS=#
.虚假:全力以赴重拍
全部:$(执行)
@回声“完成”
#
$(EXEC):buildrepo$(OBJS)
$(CC)-o$@$(OBJS)$(DEPS)$(CFLAGS)
#
$(OBJDIR)/%.o:%.c$(DEPS)
$(CC)-c-o$@$<$(CFLAGS)
#
运行:
./$(执行)
#
翻拍:清除所有
#
buildrepo:
@美元(买入回购)
#
定义并制定回购协议
对于以美元表示的目录(srcdir)\
做\
mkdir-p$(OBJDIR)/$$dir\
完成
恩德夫
#
清洁:
@echo“清理..”
$(RM)-f$(OBJS)$(EXEC)
更换

$(OBJDIR)/%.o: %.c $(DEPS)
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(SRCS))

替换

$(OBJDIR)/%.o: %.c $(DEPS)
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(SRCS))

替换

DEPS = lib.h

至少对我有用

编辑:修复
buildrepo
目标

更改
SRCDIRS
定义(删除起始“/”)并添加
OBJDIRS
定义:

SRCDIRS := $(shell find $(SRCDIR) -name '*.c' -exec dirname {} \; | uniq)
OBJDIRS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(SRCDIRS))
现在在target
buildrepo
中使用
OBJDIRS
。同时在
.PHONY
列表中添加
buildrepo

.PHONY: clean all run remake buildrepo
# ...
define make-repo
    for dir in $(OBJDIRS); \
    do \
      mkdir -p $$dir; \
    done
endef
因此,您的完整Makefile现在应该是:

#
CC = gcc
RM = rm
EXEC = main
# #
SRCDIR = src
OBJDIR = bin
# #
SRCS := $(shell find $(SRCDIR) -name '*.c')
SRCDIRS := $(shell find $(SRCDIR) -name '*.c' -exec dirname {} \; | uniq)
OBJS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRCS))
OBJDIRS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(SRCDIRS))
OBJ = # main.o lib.o
DEPS = $(SRCDIR)/lib/lib.h
# #
CFLAGS = -I. -Wall -std=c99 -save-temps 
LDFLAGS = #

.PHONY: clean all run remake buildrepo
all: $(EXEC)
    @echo "Finish."
#
$(EXEC): buildrepo $(OBJS)
    $(CC) -o $@ $(OBJS) $(DEPS) $(CFLAGS)
#
$(OBJDIR)/%.o: $(SRCDIR)/%.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)
#
run:
    ./$(EXEC)
#
remake: clean all
#
buildrepo:
    @$(call make-repo)
#
define make-repo
    for dir in $(OBJDIRS); \
    do \
      mkdir -p $$dir; \
    done
endef
#
clean:
    @echo "Cleaning up.."
    $(RM) -f $(OBJS) $(EXEC)
#
CC=gcc
RM=RM
EXEC=main
# #
SRCDIR=src
OBJDIR=bin
# #
SRCS:=$(shell查找$(SRCDIR)-名称'*.c')
SRCDIRS:=$(shell find$(SRCDIR)-name'*.c'-exec dirname{}\|uniq)
OBJS:=$(patsubst$(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRCS))
OBJDIRS:=$(patsubst$(SRCDIR)/%,$(OBJDIR)/%,$(SRCDIRS))
OBJ=#main.o lib.o
DEPS=$(SRCDIR)/lib/lib.h
# #
CFLAGS=-I.-Wall-std=c99-保存临时数据
LDFLAGS=#
.虚假:清理所有运行重新制作buildrepo
全部:$(执行)
@回声“完成”
#
$(EXEC):buildrepo$(OBJS)
$(CC)-o$@$(OBJS)$(DEPS)$(CFLAGS)
#
$(OBJDIR)/%.o:$(SRCDIR)/%.c$(DEPS)
$(CC)-c-o$@$<$(CFLAGS)
#
运行:
./$(执行)
#
翻拍:清除所有
#
buildrepo:
@美元(买入回购)
#
定义并制定回购协议
对于dir,单位为美元(OBJDIRS)\
做\
mkdir-p$$dir\
完成
恩德夫
#
清洁:
@echo“清理..”
$(RM)-f$(OBJS)$(EXEC)

如果您将
$(OBJDIR)/%.o:%.c$(DEPS)
替换为
$(OBJDIR)/%.o:$(SRCDIR)/%.c$(DEPS)
会发生什么?另外
OBJS:=$(patsubst%.c,$(OBJDIR)/%.o,$(SRCS))
应该是
OBJS:$(patsubst$(SRCDIR)/%.o,$(SRCS))
我仍然收到这个错误消息:
汇编程序消息:致命错误:无法创建bin/lib/lib.o:没有这样的文件或目录
@010010001,在我看来这似乎是一个编译器错误,这应该意味着你的makefile问题已经解决了…我不太了解你,这正常吗?还是我要补充点什么?(顺便说一句谢谢)@010010001在您发送信息错误之前打印的是什么?没有打印的编译命令吗?@010010001刚刚在我最喜欢的网络搜索引擎中找到。(您的消息错误)。您只需要创建bin/main和bin/lib目录。
SRCDIRS := $(shell find $(SRCDIR) -name '*.c' -exec dirname {} \; | uniq)
OBJDIRS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(SRCDIRS))
.PHONY: clean all run remake buildrepo
# ...
define make-repo
    for dir in $(OBJDIRS); \
    do \
      mkdir -p $$dir; \
    done
endef
#
CC = gcc
RM = rm
EXEC = main
# #
SRCDIR = src
OBJDIR = bin
# #
SRCS := $(shell find $(SRCDIR) -name '*.c')
SRCDIRS := $(shell find $(SRCDIR) -name '*.c' -exec dirname {} \; | uniq)
OBJS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRCS))
OBJDIRS := $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(SRCDIRS))
OBJ = # main.o lib.o
DEPS = $(SRCDIR)/lib/lib.h
# #
CFLAGS = -I. -Wall -std=c99 -save-temps 
LDFLAGS = #

.PHONY: clean all run remake buildrepo
all: $(EXEC)
    @echo "Finish."
#
$(EXEC): buildrepo $(OBJS)
    $(CC) -o $@ $(OBJS) $(DEPS) $(CFLAGS)
#
$(OBJDIR)/%.o: $(SRCDIR)/%.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)
#
run:
    ./$(EXEC)
#
remake: clean all
#
buildrepo:
    @$(call make-repo)
#
define make-repo
    for dir in $(OBJDIRS); \
    do \
      mkdir -p $$dir; \
    done
endef
#
clean:
    @echo "Cleaning up.."
    $(RM) -f $(OBJS) $(EXEC)