编译C文件时出现Makefile错误

时间:2014-03-02 01:40:49

标签: c makefile

我的目录结构是:

Project/
    + Source/
    |    + Module_1/
    |    |    + Module_1.c
    |    |    + Module_1.h
    |    |
    |    + Module_2/
    |    |    + Module_2.c
    |    |    + Module_2.h
    |    |
    |    + MainFile.c
    |    + MainFile.h
    |
    + Makefile

我的Makefile包含:

SHELL     := /bin/sh
CC        := clang
AR        := ar
CFLAGS    := -fPIC -std=c99 -O2
LDFLAGS   := -shared
ARFLAGS   := -rcs

BLDDIR    := Build
OBJDIR    := Object

SOURCES   := $(wildcard Source/**/*.c Source/*.c)
OBJECTS   := $(patsubst %.c, $(OBJDIR)/%.o, $(SOURCES))

TARGET_A  := $(BLDDIR)/MyLibrary.a
TARGET_SO := $(patsubst %.a, %.so, $(TARGET_A))


PREFIX    ?= /usr/local


# ------------------------------------------------------------------------------
.PHONY: all build clean dev distclean _dir

all: build

dev: CFLAGS := -g -Wall -Wextra -fPIC -std=c99
dev: all

build: _dir $(TARGET_A) $(TARGET_SO)
_dir:
    mkdir -p $(BLDDIR)
    mkdir -p $(OBJDIR)

$(TARGET_A) : $(OBJECTS)
    $(AR) $(ARFLAGS) %@ $(OBJECTS)
    $(AR) -s %@

$(TARGET_SO):
    $(CC) $(LDFLAGS) -o $@ $(OBJECTS)

$(OBJDIR)/%.o : %.c
    $(CC) $(CFLAGS) -c $< -o $@


clean:
    $(RM) -r $(OBJDIR) test

distclean: clean
    $(RM) -r $(BLDDIR)

我对此Makefile有1个问题和1个问题:

  1. 我的问题是,当我运行此文件时,我在第$(OBJDIR)/%.o : %.c行收到错误,我不知道如何修复它?我尝试将其更改为$(OBJECTS) : %.o : %.c%.o : %.c,但仍然没有运气。
  2. 这是我的第一个Makefile,我想知道我在此文件中的设置是否正常或我需要更好的策略/规则?如果是这样我怎么能改善这个?

  3. 修改

    我得到的错误是:

    make: *** No rule to make target 'Object/MainFile.c', needed by 'Object/MainFile.o'. Stop.


    修改

    正如@Beta在评论中指出的那样,我更改了每个模块中的文件名,以便*.o文件名不同。

1 个答案:

答案 0 :(得分:1)

您的makefile正在尝试构建C源文件。您具有列为somefile.c的每个对象的依赖关系。根据您的make文件,它是一个目录,位于Source目录中。因此,将行$(OBJDIR)/%.o : %.c更改为$(OBJDIR)/%.o : ../Source/%.c。使用该规则,它应该找到.c文件然后执行命令,因为.o文件的依赖性存在。