首页 > 解决方案 > 没有规则来制作目标*,*需要

问题描述

我无法理解我的 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.

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

标签: makefilegnu-make

解决方案


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

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

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

推荐阅读