如何在 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.
在我的项目中,我有目录结构 /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.