没有规则可以指定目标*,*则需要

时间:2018-11-16 12:17:54

标签: makefile gnu-make

我无法弄清我的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 。我知道有很多类似的问题,但是我无法从这些问题中解决如何解决我的问题。

1 个答案:

答案 0 :(得分:1)

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

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

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