让'说我有几个文件夹的图书馆项目:
问题是,每当我更改一个头文件并且没有意识到这一点时(这很明显,如果你看看我的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
答案 0 :(得分:1)
我能够自己解决这个问题。改变了这个:
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))
答案 1 :(得分:0)
生成标题列表:
%*f%
由于您没有任何依赖项文件,只需确保所有目标文件都依赖于所有头文件:
HEADERS := $(wildcard src/*.h)
如果修改了任何标头,则每个目标文件都会重建,因为任何源文件都可能包含(并依赖)任何头文件。
如果您不想在更改标头后重建所有内容,则可以手动添加特定的依赖项,以便仅重建所需的文件。例如:
$(OBJECTS): $(HEADERS)
这些依赖关系也可以自动生成。