【问题标题】:Makefile does not find rule for objectMakefile 找不到对象的规则
【发布时间】:2016-05-04 09:31:42
【问题描述】:

我有一个关于 Makefile 的初学者问题。我有一个非常简单的 makefile,其中包含:

SHELL = /bin/sh
CC = gcc
CFLAGS = -lm -std=c99 -g -o0
EXEC = test
BUILDDIR = build
OBJDIR = obj
SOURCES = $(shell cat sources.list)
DEPS = $(shell cat headers.list)
OBJ = $(SOURCES:.c=.o)
OBJECTS = $(patsubst %,$(OBJDIR)/%,$(OBJ))

all: $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o $(BUILDDIR)/$(EXEC)

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

clean:
    rm -f $(BUILDDIR)/$(EXEC) $(OBJDIR)/*.o

我的问题是,如果我尝试使用这个 Makefile 进行编译,它会返回错误消息:

there is no rule for the target obj/Name.o

我做错了什么?

经过最初的几个 cmets 和进一步的研究,我得到了这个工作版本,但它不会在 obj 文件夹中创建目标文件,所以这不是我的目标

SHELL = /bin/sh
CC = gcc
CFLAGS = -lm -std=c99 -g -o0
EXEC = test
BUILDDIR = build
OBJDIR = obj
SOURCES = $(shell cat sources.list)
DEPS = $(shell cat headers.list)
OBJ = $(SOURCES:.c=.o)
OBJECTS = $(patsubst %,$(OBJDIR)/%,$(OBJ))

all: $(BUILDDIR)/$(EXEC)

$(BUILDDIR)/$(EXEC): $(OBJ)
$(CC) $(CFLAGS) $(OBJ) -o  $(BUILDDIR)/$(EXEC)

%.o: %.c $(DEPS)
$(CC) -c $< -o $@


clean:
rm -f $(BUILDDIR)/$(EXEC) $(OBJDIR)/*.o

【问题讨论】:

  • 顶级目录中是否存在Name.c
  • 是的,否则makefile不需要构建.o
  • 你的sources.list文件中有name.c吗?
  • 目前还没有解决问题,-lm 应该在变量LD_FLAGS 中,而不是CFLAGS
  • 在您当前的 all 规则中将 all 替换为 $(BUILDDIR)/$(EXEC)。在没有命令的情况下添加all 规则:all:$(BUILDDIR)/$(EXEC),并添加.PHONY 指令:.PHONY:all clean.PHONY 设置不是实际文件的目标列表。

标签: c makefile rule


【解决方案1】:

headers.list 中的所有文件是否都在正确的位置?

顺便说一句,这不是处理对标头的依赖的好方法。您应该查看-MP-MDD 以及预处理器的其他选项以生成依赖项。

【讨论】:

    【解决方案2】:

    一个经典的 makefile 应该可以满足你的需要:

    SHELL=/bin/bash
    CC=gcc
    CFLAGS=-std=c99 -g -o0
    LDFLAGS=-lm
    EXEC=test
    BUILDDIR=build/
    OBJDIR=obj/
    SOURCES=$(shell cat sources.list)
    OBJECTS=$(patsubst %.c,$(OBJDIR)%.o,$(notdir $(SOURCES)))
    
    vpath %.c $(sort $(dir $(SOURCES)))
    
    .PHONY:all mrproper clean depends
    
    all:$(BUILDDIR)$(EXEC)
    
    $(BUILDDIR)$(EXEC):$(OBJECTS)|$(BUILDDIR)
        $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
    
    $(OBJDIR)%.o:%.c|$(OBJDIR)
        $(CC) -c $< -o $@
    
    $(BUILDDIR) $(OBJDIR):
        mkdir $@
    
    mrproper:clean
        rm -f $(BUILDDIR)$(EXEC)
    
    clean:
        rm -f $(OBJECTS)
    
    depends:
        @rm -f dependencies.mk
        @for i in $(SOURCES); do $(CC) -MM $$i -MT $(OBJDIR)`basename $$i | sed s:.c$$:.o:` >> dependencies.mk; done
    
    include $(wildcard dependencies.mk)
    

    如果有不清楚的地方,请告诉我。

    用法:

    make depends
    make
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多