Нет правила, чтобы сделать цель *, необходимый * - PullRequest
0 голосов
/ 16 ноября 2018

Я не могу понять, что не так с моим make-файлом:

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. Я знаю, что есть много похожих вопросов, но я не мог понять из этих вопросов, как решить мою проблему.

1 Ответ

0 голосов
/ 16 ноября 2018

Проблема в том, что исходные и объектные файлы должны быть размещены в разных каталогах, и для этого нет неявного правила.

Вам необходимо добавить правило для того, как преобразовать исходный файл в файл.объектный файл:

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