如何在 makefile 中搜索头文件并创建丢失的目录

How to search header file and create missing directory in makefile

在我的项目中,我有目录结构 /libs/src。我想创建 makefile,其中 main 依赖于 /libs。 IE。头文件在 /libs 中。我使用了以下

#Compiler to use
CC=gcc
#Compiler flags to use
CFLAGS=-c -Wall

BUILD = ./build
SRC = ./src
LIBS = ./libs

SOURCES = $(SRC)/main.c $(SRC)/SmallComponent1.c $(SRC)/SmallComponent2.c $(LIBS)/ExtLib.c
OBJECTS = $(SOURCES: .c=.o)
EXECUTABLE = $(BUILD)/appl.exe
all: $(OBJECTS) $(EXECUTABLE)

$(BUILD):
    mkdir $(BUILD)

$(EXECUTABLE) : $(OBJECTS)
    $(CC) $(OBJECTS) -o $@ 
.c.o: 
    $(CC) $(CFLAGS) -I$(LIBS) $< -o $@





phony: clean
clean:
    rm $(BUILD)/*.o $(BUILD)/appl.exe

问题是:如果 /build 不存在,我该如何创建?以及如何在 $(CC) $(CFLAGS) -I$(LIBS) $< -o $@ 中包含外部 .h,因为 -I$(LIBS) 不起作用,我收到以下错误 ./src/main.c:4:20: fatal error: ExtLib.h: No such file or directory

要在需要之前创建构建目录,请使用 order-only prerequisite (OOP) 并使用 mkdir-p 选项以避免在它已经存在时出现错误(它由于 OOP 而不需要,但在 Makefile 中使用此选项总是更好):

$(BUILD):
    mkdir -p $@

$(EXECUTABLE) : $(OBJECTS) | $(BUILD)
    $(CC) $(OBJECTS) -o $@

对于您的其他问题,我们需要更多信息;正如您所描述的那样,它是不可复制的。尝试提供一个 MCVE.