没有制定目标 * 的规则,* 需要

No rule to make target *, needed by *

我不知道我的 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.

P.S. 我知道有很多类似的问题,但我无法从这些问题中得到如何解决我的问题。

问题是源文件和目标文件应该放在不同的目录中,对此没有隐含的规则。

您需要添加有关如何将源文件转换为目标文件的规则:

$(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