c语言makefile编译动态库
时间: 2024-08-16 20:03:13 浏览: 59
Makefile在C语言中主要用于自动化构建过程,特别是当项目较大、包含多个源文件和目标文件时,它可以帮助管理编译步骤。要编译动态链接库(通常称为.so文件),你需要在Makefile中设置以下几个关键部分:
1. **变量设定**:
- `CC` 或 `CXX`: 编译器(例如 gcc 或 g++)。
- `AR` 和 `RANLIB`: 索引程序(用于创建静态库)和归档程序(用于压缩库)。
2. **规则定义**:
- `SRCS` 变量列出所有需要编译的源文件。
- `OBJS` 变量基于`SRCS`生成的对应目标文件名(通常是.c或.cpp扩展名转成.o)。
- 添加一个新的规则,如 `libfoo.so: $(OBJS)`, 表示当`$(OBJS)`都存在时,将生成`libfoo.so`。
3. **编译规则**:
- 使用 `$(CC)` 和 `-shared` 选项编译为动态库,比如 `%.o: %.c`可以写成 `$(CC) -c -fPIC $< -o $@`.
- 使用 `ar` 命令打包目标文件为静态库:`$(AR) rcs libfoo.a $(OBJS)`.
- 如果需要运行链接(如有依赖的库),则添加 `$(CC) -shared -o libfoo.so $(OBJS) -Lpath/to/library -ldependency`.
4. **安装规则**:
- 安装前确保清理旧版本(如果有):`clean:; rm -rf libfoo*`
- 安装时将库移动到指定位置,如 `/usr/local/lib` 或 `install: clean; cp libfoo.so /your/install/path`.
例子:
```makefile
CC = gcc
AR = ar
SRCS = source1.c source2.c source3.c
OBJS = $(SRCS:.c=.o)
all: libfoo.so
%.o: %.c
$(CC) -c -Wall -std=c99 -fPIC $< -o $@
libfoo.so: $(OBJS)
$(CC) -shared -o libfoo.so $(OBJS) -lm
clean:
rm -rf *.o libfoo.*
install: clean
cp libfoo.so /usr/local/lib/
```
阅读全文