makefile include 其他目录的头文件
时间: 2023-08-05 14:09:02 浏览: 83
makefile 可以通过include命令来包含其他目录的头文件。下面是一个简单的示例:
假设我们的源代码和头文件分别位于project/src和project/include目录下,我们需要在makefile中包含include目录下的头文件,可以按照以下方式编写makefile:
```
CC = gcc
CFLAGS = -Wall -g
INCLUDE = -I./include
SRC = file1.c file2.c file3.c
OBJ = $(SRC:.c=.o)
EXE = myprogram
all: $(EXE)
$(EXE): $(OBJ)
$(CC) $(CFLAGS) $(OBJ) -o $(EXE)
%.o:%.c
$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
clean:
rm -f $(OBJ) $(EXE)
```
上面的makefile中,我们通过定义一个INCLUDE变量来指定头文件所在的目录,并在编译规则中使用$(INCLUDE)变量来指定头文件目录。
使用make命令即可执行编译过程。执行完毕后,所有的源文件都会被编译成目标文件,并生成可执行文件。同时,由于我们指定了头文件目录,因此编译器也会在该目录下查找头文件并进行编译。
相关问题
makefile多目录和头文件编译
在Makefile中实现多目录和头文件编译的关键是要将头文件的路径和源文件的路径分开,以便在编译时能够正确地找到这些文件。
以下是一个简单的Makefile示例,演示了如何实现多目录和头文件编译:
```
CC = gcc
CFLAGS = -Wall -Wextra -Werror
INCLUDES = -I./include
SRCDIR = src
OBJDIR = obj
BINDIR = bin
SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))
EXECUTABLE = $(BINDIR)/myprogram
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(CFLAGS) $(INCLUDES) $^ -o $@
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
clean:
rm -f $(OBJECTS) $(EXECUTABLE)
```
在此Makefile中,`SRCDIR`定义源文件的目录,`OBJDIR`定义对象文件的目录,`BINDIR`定义可执行文件的目录,`INCLUDES`定义头文件的路径。
我们使用`wildcard`函数来获取源文件的所有文件名,并使用`patsubst`函数将它们转换为对象文件的文件名。然后,我们定义了一个名为`all`的目标,它将生成可执行文件。我们使用`$(EXECUTABLE)`作为目标,并将它的依赖项设置为所有的对象文件。在`$(EXECUTABLE)`的规则中,我们链接了所有的对象文件以生成可执行文件。在对象文件的规则中,我们编译了每个源文件并将其转换为一个对象文件。
最后,我们定义了一个名为`clean`的目标,用于清除所有对象文件和可执行文件。
请注意,此Makefile假定源文件和头文件分别在`src`和`include`子目录中。您可以根据实际情况修改这些目录。
Makefile 中批量引用头文件
可以使用 Makefile 中的变量和模式规则来批量引用头文件。假设有多个源文件需要引用同一个头文件,可以在 Makefile 中定义一个变量来存储头文件名,然后使用模式规则来匹配源文件,将头文件名添加到编译命令中。
示例 Makefile:
```
# 定义头文件名变量
HEADER = common.h
# 模式规则,将头文件名添加到编译命令中
%.o: %.c
gcc -c -o $@ $< -I. -I$(HEADER_DIR) -include $(HEADER)
# 编译目标
target: file1.o file2.o file3.o
gcc -o target file1.o file2.o file3.o
```
在上面的示例中,头文件名存储在变量 `HEADER` 中,模式规则中使用 `-include` 参数将头文件引入编译命令中。在编译目标时,将编译生成的目标文件链接起来即可。