动态库和静态库有什么区别?对应的makefile中如何调用?

动态库和静态库的主要区别在于它们的存储位置和链接方式。

  1. 存储位置:动态库通常以.so(Linux)或.dll(Windows)为扩展名存储在程序的运行时路径中,而静态库通常以.a(Linux)或.lib(Windows)为扩展名存储在程序的编译时路径中。

  2. 链接方式:当程序需要使用动态库中的函数或变量时,需要在编译命令中指定动态库的路径。而静态库则不需要额外的操作,只需在编译命令中指定静态库的路径即可。

在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`。

你可能感兴趣的:(linux,c语言,git)