makefile如何编译.a文件
时间: 2023-07-27 22:07:26 浏览: 264
以下是一个简单的 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` 命令可以删除所有生成的目标文件和静态库文件。
阅读全文