代码之家  ›  专栏  ›  技术社区  ›  Denis Steinman

没有规则使目标*,需要*

  •  -1
  • Denis Steinman  · 技术社区  · 6 年前

    我不知道我的makefile有什么问题:

    DIST_PATH = ../dist/libs
    BUILD_PATH = ../build
    
    MKDIR_P = mkdir -p
    
    .PHONY: all
    
    SHELL   = /bin/sh
    CC      = gcc
    FLAGS   = -std=gnu99
    CFLAGS  = -fPIC -pedantic -Wall -Werror
    LDFLAGS = -shared
    
    LOG_SRCS = $(shell echo log/*.c)
    LOG_HEADERS = $(shell echo log/*.h)
    LOG_OBJS = $(addprefix $(BUILD_PATH)/, $(notdir $(LOG_SRCS:.c=.o)))
    LOG_TARGET = $(DIST_PATH)/liblog.so
    
    all: dirs $(LOG_TARGET)
    
    dirs : 
        $(MKDIR_P) $(DIST_PATH)
        $(MKDIR_P) $(BUILD_PATH)
    
    $(LOG_TARGET) : $(LOG_OBJS)
        $(CC) $(FLAGS) $(CFLAGS) -o $@ $(LDFLAGS)
    

    我需要从 log/ 文件夹到 ../dist/libs 把obj文件放进去 ../build 但我得到了错误:

    make: *** No rule to make target '../build/log.o', needed by '../dist/libs/liblog.so'.  Stop.
    

    附笔。 我知道有许多类似的问题,但我无法从这些问题中得到解决我的问题的方法。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Some programmer dude    6 年前

    问题是,源文件和对象文件应该放在不同的目录中,并且没有隐式规则。

    您需要为如何将源文件转换为对象文件添加规则:

    $(BUILD_PATH)/%.o: log/%.c
    

    现在 make 知道如何从源文件创建对象文件。


    但还有一个问题:

    $(LOG_TARGET) : $(LOG_OBJS)
        $(CC) $(FLAGS) $(CFLAGS) -o $@ $(LDFLAGS)
    

    该命令没有列出任何输入文件,您需要添加所有要链接的对象文件:

    $(LOG_TARGET) : $(LOG_OBJS)
        $(CC) $(FLAGS) $(CFLAGS) -o $@ $^ $(LDFLAGS)
    #                                  ^^
    # List of all "prerequisites" (object files) to be linked