2.3 编写Makefile,在终端执行make后,add.c sub.c中的函数自动制作成动态库libmymath.so,并自动编译main.c 链接需要的库,生成可执行文件并自动运行。
时间: 2024-02-21 21:01:13 浏览: 169
好的,让我来一步步教你如何编写 Makefile。
首先,我们需要定义一些变量,以便于 Makefile 中的重复使用。在这个例子中,我们需要定义以下变量:
```
CC = gcc
CFLAGS = -Wall -Wextra -Werror
LDFLAGS = -L. -lmymath
LIBS = -lmymath
```
- `CC` 变量定义了编译器的名称。
- `CFLAGS` 变量定义了编译器的选项。
- `LDFLAGS` 变量定义了链接器的选项,包括动态库的搜索路径。
- `LIBS` 变量定义了需要链接的库。
接下来,我们需要定义一些规则,以便于 Makefile 中的重复使用。在这个例子中,我们需要定义以下规则:
```
all: myprogram
myprogram: main.o libmymath.so
$(CC) $(LDFLAGS) $< -o $@ $(LIBS)
libmymath.so: add.o sub.o
$(CC) -shared -fPIC $^ -o $@
main.o: main.c
$(CC) $(CFLAGS) -c $< -o $@
add.o: add.c
$(CC) $(CFLAGS) -c $< -o $@
sub.o: sub.c
$(CC) $(CFLAGS) -c $< -o $@
```
这些规则的意思是:
- `all` 是默认规则,它依赖于 `myprogram` 规则。
- `myprogram` 规则依赖于 `main.o` 和 `libmymath.so`,它使用链接器将 `main.o` 和 `libmymath.so` 链接在一起,生成可执行程序 `myprogram`。
- `libmymath.so` 规则依赖于 `add.o` 和 `sub.o`,它使用编译器将 `add.o` 和 `sub.o` 编译成动态库 `libmymath.so`。
- `main.o` 规则依赖于 `main.c`,它使用编译器将 `main.c` 编译成 `main.o`。
- `add.o` 规则依赖于 `add.c`,它使用编译器将 `add.c` 编译成 `add.o`。
- `sub.o` 规则依赖于 `sub.c`,它使用编译器将 `sub.c` 编译成 `sub.o`。
最后,我们需要定义一些伪目标,以便于 Makefile 中的使用。在这个例子中,我们需要定义以下伪目标:
```
.PHONY: clean run
clean:
rm -f *.o *.so myprogram
run: myprogram
./myprogram
```
这些伪目标的意思是:
- `.PHONY` 定义了伪目标。
- `clean` 伪目标用于清除所有生成的文件。
- `run` 伪目标用于运行可执行程序。
把所有这些内容放在一个名为 Makefile 的文件中,然后在终端中执行 `make` 命令,就可以自动制作成动态库 libmymath.so,自动编译 main.c,链接需要的库,生成可执行文件并自动运行了。
阅读全文