现在有以下文件./ ├── bin ├── inc │ ├── add.h │ ├── div.h │ ├── mul.h │ └── sub.h ├── Makefile ├── obj └── src ├── add.c ├── div.c ├── mul.c ├── sub.c └── test.c./ ├── bin ├── inc │ ├── add.h │ ├── div.h │ ├── mul.h │ └── sub.h ├── Makefile ├── obj └── src ├── add.c ├── div.c ├── mul.c ├── sub.c └── test.c编写Makefile生成可执行文件test
时间: 2024-01-26 16:03:18 浏览: 69
以下是可能的Makefile文件:
```
CC = gcc
CFLAGS = -Wall -Wextra -pedantic -std=c11
SRCDIR = src
INCDIR = inc
OBJDIR = obj
BINDIR = bin
SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))
INCLUDES = -I$(INCDIR)
TARGET = $(BINDIR)/test
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) $(INCLUDES) $^ -o $@
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
clean:
rm -f $(OBJDIR)/*.o $(TARGET)
```
这个Makefile假设你的源代码文件在src目录中,头文件在inc目录中,可执行文件将被编译到bin目录中,目标文件将被编译到obj目录中。如果你想改变这些位置,你需要修改Makefile中的相应变量。
要编译代码,只需在终端中运行`make`。如果一切顺利,你将得到一个名为test的可执行文件。要清除所有目标文件和可执行文件,可以运行`make clean`。
相关问题
现在有以下文件├── bin ├── inc │ ├── add.h │ ├── div.h │ ├── mul.h │ └── sub.h ├── Makefile ├── obj └── src ├── add.c ├── div.c ├── mul.c ├── sub.c └── test.c
这个目录结构看起来像是一个简单的 C 语言项目。其中 `bin` 目录存放编译出来的可执行文件,`inc` 目录存放头文件,`obj` 目录存放编译过程中生成的目标文件,`src` 目录存放源代码文件(包括测试代码)。
`Makefile` 文件是一个用来自动化构建整个项目的脚本。它描述了如何编译、链接各个源代码文件,以及如何生成最终的可执行文件。在这个例子中,`Makefile` 文件应该包含一系列规则,如下所示:
```
CC=gcc
CFLAGS=-Wall -Werror -O2
LDFLAGS=
SRCS=$(wildcard src/*.c)
OBJS=$(patsubst src/%.c,obj/%.o,$(SRCS))
all: bin/test
bin/test: $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^
obj/%.o: src/%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf obj/*.o bin/test
```
这个 `Makefile` 中定义了三个变量:
- `CC`:指定编译器,这里使用 `gcc`。
- `CFLAGS`:指定编译选项,这里开启了一些警告和优化。
- `LDFLAGS`:指定链接选项,这里为空。
然后定义了两个变量:
- `SRCS`:包含了 `src` 目录下所有的 `.c` 源文件。
- `OBJS`:根据 `SRCS` 变量自动生成了所有的目标文件路径。
接下来定义了三个规则:
- `all`:默认规则,依赖于 `bin/test` 目标。
- `bin/test`:生成最终的可执行文件,依赖于所有的目标文件。
- `obj/%.o`:生成单个目标文件,依赖于对应的源文件。
最后定义了一个 `clean` 规则,用于清除生成的目标文件和可执行文件。
阅读全文