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