2014-03-04 50 views
1

我有两个单独的C项目,客户端和服务器,共享一些源文件。我有三个dirs:服务器,客户端和通用。我正在尝试为其中一个创建一个Makefile,它将使用当前项目中的src/dir源文件和../common/ dir中的源文件,将它们全部编译为.o文件并将它们放入obj/dir中。然后将所有.o文件从obj /链接在一起。对于第一次尝试,我只放了一个文件:main.c在src /中,并且剩下../common/为空。具有公共目录的两个项目的Makefile

我目前的版本给我一个错误:

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) [email protected] $(LFLAGS) $(OBJECTS) 
    @echo "Linking complete" 

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c $(CMNDIR)/%.c 
    @$(CC) $(CFLAGS) $< -o [email protected] 
    @echo "Compiled $<" 

.PHONEY: clean 

clean: 
    @$(rm -f) $(OBJECTS) 

回答

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 [email protected] $(LFLAGS) $(OBJECTS) 
    @echo "Linking complete" 

$(OBJDIR)/%.o : $(SRCDIR)/%.c 
    @$(CC) $(CFLAGS) $< -o [email protected] 
    @echo "Compiled $<" 

$(OBJDIR)/%.o : $(CMNDIR)/%.c 
    @$(CC) $(CFLAGS) $< -o [email protected] 
    @echo "Compiled $<" 

.PHONEY: clean 

clean: 
    @$(rm -f) $(OBJECTS)