Библиотека C, зависимости заголовка make-файла
Допустим, у меня есть проект библиотеки с несколькими папками:
- build: куда идут файлы.o
- lib: куда идут скомпилированные статические и динамические библиотеки
- src: куда идут исходные файлы.c
- включать: где размещены заголовки
Проблема в том, что каждый раз, когда я изменяю заголовочный файл и make не воспринимает это (это очевидно, почему, если вы посмотрите на мой Makefile) и говорит, что все обновлено. Мне удалось решить это с другим проектом, который не был библиотекой, но с этим каждый раз, когда я что-то пробую, я получаю сообщение об ошибке, когда цель создается. Вот Makefile:
CC=gcc
CFLAGS=-g -O2 -Wall -Iinclude -rdynamic -DNDEBUG $(OPTFLAGS)
LDFLAGS=$(OPTLIBS)
SOURCES=$(wildcard src/*.c)
OBJECTS=$(patsubst src/%.c,build/%.o,$(SOURCES))
TARGET=lib/libdatastruct.a
SO_TARGET=$(patsubst %.a,%.so,$(TARGET))
# The Target lib
all: $(TARGET) $(SO_TARGET)
dev: CFLAGS=-g -Wall -Iinclude -Wall -Wextra $(OPTFLAGS)
dev: all
$(TARGET): CFLAGS += -fPIC
$(TARGET): build $(OBJECTS)
ar rcs $@ $(OBJECTS)
ranlib $@
$(SO_TARGET): $(TARGET) $(OBJECTS)
$(CC) -shared -o $@ $(OBJECTS)
build/%.o: src/%.c
$(CC) $(CFLAGS) -o $@ -c $<
build:
@mkdir -p lib
@mkdir -p build
clean:
rm -rf lib build
2 ответа
Я смог решить это сам. Изменено это:
build/%.o: src/%.c
$(CC) $(CFLAGS) -o $@ -c $<
К этому:
build/%.o: src/%.c
$(CC) $(CFLAGS) -MMD -o $@ -c $<
include $(DEPS)
$(DEPS): ;
И добавил:
DEPS=$(patsubst %.o,%.d,$(OBJECTS))
После:
OBJECTS=$(patsubst src/%.c,build/%.o,$(SOURCES))
Создайте список заголовков:
HEADERS := $(wildcard src/*.h)
и поскольку у вас нет файлов зависимостей, просто убедитесь, что все объектные файлы зависят от всех заголовочных файлов:
$(OBJECTS): $(HEADERS)
Если какой-либо заголовок изменяется, каждый объектный файл перестраивается, поскольку любой исходный файл может включать (и зависеть) от любого заголовочного файла.
Если вы не хотите перестраивать все после изменения заголовка, вы можете вручную добавить определенные зависимости, чтобы перестраивать только необходимые файлы. Например:
src/file.c: src/file.h
src/main.c: src/main.h src/file.h
Эти зависимости также могут быть сделаны автоматически.