makefile 只编译成目标文件
时间: 2023-07-31 21:13:35 浏览: 46
makefile 可以通过指定规则只编译成目标文件。下面是一个简单的示例:
```
CC = gcc
CFLAGS = -Wall -g
SRC = file1.c file2.c file3.c
OBJ = $(SRC:.c=.o)
all: $(OBJ)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJ)
```
上面的makefile中,只定义了一个all规则,将$(OBJ)作为目标文件,$(SRC)中的所有源文件作为依赖,指定编译器和编译选项,即可自动编译所有的源文件并生成目标文件。
同时,定义了一个%.o:%.c规则来自动编译每个目标文件。最后,定义了一个clean规则,用于清理生成的目标文件。
使用make命令即可执行编译过程。执行完毕后,所有的源文件都会被编译成目标文件,但不会生成可执行文件。
相关问题
makefile如何编译.a文件
以下是一个简单的 Makefile 示例,用于编译 .a 静态库文件:
```
CC = gcc
AR = ar
CFLAGS = -Wall -Werror
SRCDIR = src
INCDIR = include
OBJDIR = obj
LIBDIR = lib
SRC = $(wildcard $(SRCDIR)/*.c)
INC = $(wildcard $(INCDIR)/*.h)
OBJ = $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SRC))
LIB = $(LIBDIR)/libname.a
$(OBJDIR)/%.o: $(SRCDIR)/%.c $(INC)
$(CC) $(CFLAGS) -c -o $@ $< -I$(INCDIR)
$(LIB): $(OBJ)
$(AR) rcs $@ $^
.PHONY: clean
clean:
rm -f $(OBJDIR)/*.o $(LIB)
```
解释:
- `CC` 和 `AR` 分别指定编译器和静态库打包工具。
- `CFLAGS` 指定编译选项,例如 `-Wall` 表示开启所有警告选项,`-Werror` 表示把警告视为错误。
- `SRCDIR`、`INCDIR`、`OBJDIR`、`LIBDIR` 分别指定源代码目录、头文件目录、目标文件目录和静态库目录。
- `SRC`、`INC`、`OBJ`、`LIB` 分别指定源代码文件、头文件、目标文件和静态库文件。
- `$(wildcard)` 函数用于获取指定目录下的所有文件名,例如 `$(wildcard $(SRCDIR)/*.c)` 表示获取 `src` 目录下所有以 `.c` 结尾的文件名。
- `$(patsubst)` 函数用于替换文件名中的字符串,例如 `$(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SRC))` 表示将所有 `src` 目录下的 `.c` 文件替换成 `obj` 目录下的 `.o` 文件。
- `$(OBJDIR)/%.o: $(SRCDIR)/%.c $(INC)` 表示一个模式规则,用于将 `.c` 文件编译成 `.o` 文件。
- `$(AR) rcs $@ $^` 用于将所有 `.o` 文件打包成 `.a` 静态库文件。
- `.PHONY: clean` 表示 `clean` 是一个伪目标,不是一个真正的文件。
- `clean:` 用于定义 `clean` 伪目标的规则,用于删除所有 `.o` 文件和静态库文件。
使用方法:
1. 将上述 Makefile 文件保存为 `Makefile`。
2. 在命令行中进入到 Makefile 所在的目录,执行 `make` 命令即可编译静态库文件。
3. 执行 `make clean` 命令可以删除所有生成的目标文件和静态库文件。
makefile编译命令多文件
以下是一个makefile编译多个文件的例子:
假设我们有三个文件:main.c、func1.c和func2.c,其中main.c包含main函数,func1.c和func2.c包含一些函数。我们需要将这三个文件编译成一个可执行文件。
```makefile
# 定义编译器
CC = gcc
# 定义编译选项
CFLAGS = -Wall
# 定义目标文件
TARGET = mytool
# 定义源文件
SRCS = main.c func1.c func2.c
# 将源文件名替换为目标文件名
OBJS = $(SRCS:.c=.o)
# 默认目标
all: $(TARGET)
# 生成目标文件
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
# 生成中间文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 清理中间文件和目标文件
clean:
rm -f $(OBJS) $(TARGET)
```
在上面的makefile中,我们定义了编译器和编译选项,以及目标文件和源文件。我们使用了一个默认目标all,它依赖于目标文件$(TARGET)。$(TARGET)又依赖于中间文件$(OBJS)。我们使用了一个模式规则来生成中间文件,它将.c文件替换为.o文件。最后,我们定义了一个清理目标clean,它将删除中间文件和目标文件。
要编译这个makefile,只需要在终端中输入make命令即可。如果一切顺利,将生成一个名为mytool的可执行文件。
相关推荐
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)