我有两个独立的C项目,客户端和服务器,共享一些源文件。我有三个目录:服务器,客户端和普通用户。我正在尝试为其中一个创建一个Makefile,它将使用当前项目中src / dir的源代码和来自../common/dir的源代码,将它们全部编译为.o文件并将它们放入obj / dir中。然后从obj /中链接所有.o文件。对于第一次尝试,我只放了一个文件:main.c在src /中并且离开../common/为空。
我当前的版本给了我一个错误:
Makefile:18: target `src/main.c' doesn't match the target pattern
make: *** No rule to make target `../common/main.c', needed by `obj/main.o'. Stop.
这是我的尝试:
TARGET = server
CC = gcc -c
LINKER = gcc
CFLAGS = -Wall -Wextra -pedantic -O2 -g -std=gnu99
SRCDIR = src
CMNDIR = ../common
OBJDIR = obj
SOURCES := $(wildcard $(SRCDIR)/*.c) $(wildcard $(CMNDIR)/*.c)
INCLUDES := $(wildcard $(SRCDIR)/*.h) $(wildcard $(CMNDIR)/*.h)
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o) $(SOURCES:$(CMNDIR)/%.c=$(OBJDIR)/%.o)
$(TARGET): $(OBJECTS)
@$(LINKER) $(CFLAGS) $@ $(LFLAGS) $(OBJECTS)
@echo "Linking complete"
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c $(CMNDIR)/%.c
@$(CC) $(CFLAGS) $< -o $@
@echo "Compiled $<"
.PHONEY: clean
clean:
@$(rm -f) $(OBJECTS)
答案 0 :(得分:1)
在第18行,您有一个无效的依赖关系规则,格式为target : target : dependencies
。您对$(OBJECTS)的定义会生成一个包含“c”源文件的列表,这是不正确的。最后,链接器调用缺少“-o”开关。所以我用这种方式修改了它:
TARGET = server
CC = gcc -c
LINKER = gcc
CFLAGS = -Wall -Wextra -pedantic -O2 -g -std=gnu99
SRCDIR = src
CMNDIR = ../common
OBJDIR = obj
SOURCES := $(wildcard $(SRCDIR)/*.c) $(wildcard $(CMNDIR)/*.c)
INCLUDES := $(wildcard $(SRCDIR)/*.h) $(wildcard $(CMNDIR)/*.h)
OBJECTS := $(patsubst %.c,%.o,$(SOURCES))
$(TARGET): $(OBJECTS)
@$(LINKER) $(CFLAGS) -o $@ $(LFLAGS) $(OBJECTS)
@echo "Linking complete"
$(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) $< -o $@
@echo "Compiled $<"
$(OBJDIR)/%.o : $(CMNDIR)/%.c
@$(CC) $(CFLAGS) $< -o $@
@echo "Compiled $<"
.PHONEY: clean
clean:
@$(rm -f) $(OBJECTS)