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

本文讲述了动态库(如.so和.dll)与静态库(如.a和.lib)在存储位置、链接方式上的差异,以及如何在Makefile中正确引用它们进行编译。通过实例演示了如何在Makefile中设置编译选项和链接库文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值