具有公共目录的两个项目的Makefile

时间:2014-03-04 20:44:17

标签: c makefile

我有两个独立的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)

1 个答案:

答案 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)