C 使不按预期工作
我试图创建一个Makefile来简化我的工作,但似乎我做错了什么。。下面是项目文件的内容: 工作空间 这就是我的项目的样子,在我运行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
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))
现在在targetbuildrepo
中使用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)