动态库和静态库的主要区别在于它们的存储位置和链接方式。
-
存储位置:动态库通常以
.so
(Linux)或.dll
(Windows)为扩展名存储在程序的运行时路径中,而静态库通常以.a
(Linux)或.lib
(Windows)为扩展名存储在程序的编译时路径中。 -
链接方式:当程序需要使用动态库中的函数或变量时,需要在编译命令中指定动态库的路径。而静态库则不需要额外的操作,只需在编译命令中指定静态库的路径即可。
在Makefile文件中调用静态库和动态库,你需要使用`-l`选项来链接库文件。以下是一个简单的示例:
1. 假设你有一个名为`mylib`的静态库和一个名为`mylib_shared`的动态库。
2. 你的源文件名为`main.c`。
3. 你的目标文件名为`main`。
首先,创建一个名为`Makefile`的文件,然后在其中添加以下内容:
```makefile
# 编译器
CC = gcc
# 编译选项
CFLAGS = -Wall -g
# 目标文件
TARGET = main
# 源文件
SOURCES = main.c
# 静态库
STATIC_LIB = mylib.a
# 动态库
SHARED_LIB = mylib_shared.so
# 链接选项
LDFLAGS = -L. -lmylib -lmylib_shared
# 默认目标
all: $(TARGET)
# 编译规则
$(TARGET): $(SOURCES)
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
# 清理规则
clean:
rm -f $(TARGET) $(STATIC_LIB) $(SHARED_LIB)
```
在这个示例中,我们使用了`-L`选项来指定库文件所在的目录,然后使用`-l`选项来链接库文件。注意,静态库需要使用`.a`扩展名,而动态库需要使用`.so`扩展名。
要编译这个程序,只需在命令行中运行`make`命令即可:
```bash
$ make
```
这将生成一个名为`main`的可执行文件,以及两个库文件`mylib.a`和`mylib_shared.so`。