makefile生成so库案例
时间: 2023-08-09 12:11:23 浏览: 53
假设我们有一个 C++ 项目,其中包含一个名为 `example.cpp` 的源文件,我们想将其编译为一个动态链接库(即 `.so` 文件)。
以下是一个简单的 Makefile 示例,它包含了生成 `.so` 文件所需的基本步骤:
```
CC=g++
CFLAGS=-c -Wall -fPIC
LDFLAGS=-shared
SOURCES=example.cpp
OBJECTS=$(SOURCES:.cpp=.o)
LIBRARY=libexample.so
all: $(SOURCES) $(LIBRARY)
$(LIBRARY): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
clean:
rm -f $(OBJECTS) $(LIBRARY)
```
在上面的 Makefile 中,我们定义了以下变量:
- `CC`: 编译器,使用 g++。
- `CFLAGS`: 编译器选项,包括 `-c`(只编译,不链接)、`-Wall`(开启所有警告)和 `-fPIC`(生成位置无关代码,用于动态链接库)。
- `LDFLAGS`: 连接器选项,包括 `-shared`(生成动态链接库)。
- `SOURCES`: 源文件列表,只包含一个 `example.cpp`。
- `OBJECTS`: 目标文件列表,根据源文件列表生成,例如 `example.o`。
- `LIBRARY`: 目标动态链接库名,为 `libexample.so`。
下面是 Makefile 中的规则解释:
- `all`: 默认目标,生成动态链接库。
- `$(LIBRARY)`: 生成动态链接库的规则。依赖于 `$(OBJECTS)`,即编译所有源文件生成的目标文件。使用 `$(CC)` 和 `$(LDFLAGS)` 进行链接操作,在输出文件 `$@` 中生成动态链接库。
- `.cpp.o`: 生成目标文件的规则。依赖于源文件。使用 `$(CC)` 和 `$(CFLAGS)` 进行编译操作,在输出文件中生成目标文件。
- `clean`: 清理规则,删除所有目标文件和动态链接库。
要生成动态链接库,只需在终端中运行 `make` 命令即可。`libexample.so` 文件将生成在当前目录下。
如果要清理所有目标文件和动态链接库,可以运行 `make clean` 命令。