跳至主要内容

23.静态链接库

C 语言调用静态库

静态库是把多个目标文件(.o)打包成一个归档文件,链接时直接把代码复制进可执行文件。下面以最简单的例子说明整个过程。

1. 编写库源码

mylib.h(头文件,声明接口):

1
2
3
4
5
6
#ifndef MYLIB_H
#define MYLIB_H

int add(int a, int b);

#endif

mylib.c(实现):

1
2
3
4
5
#include "mylib.h"

int add(int a, int b) {
return a + b;
}

2. 生成静态库

Linux / macOS(gcc + ar):

1
2
gcc -c mylib.c -o mylib.o      # 编译成目标文件
ar rcs libmylib.a mylib.o # 打包成静态库,命名必须以 lib 开头、.a 结尾

Windows(MSVC):

1
2
cl /c mylib.c                  # 编译成 mylib.obj
lib /OUT:mylib.lib mylib.obj # 生成 .lib 静态库

3. 在主程序中调用

main.c:

1
2
3
4
5
6
7
#include <stdio.h>
#include "mylib.h" // 包含库的头文件

int main(void) {
printf("%d\n", add(2, 3));
return 0;
}

4. 编译并链接

1
2
3
4
5
# Linux / macOS(gcc)
gcc main.c -I./include -L./lib -lmylib -o main

# Windows(gcc 同样适用;MSVC 则用 cl main.c mylib.lib)
gcc main.c -I. mylib.lib -o main.exe

参数说明:

参数 作用
-I路径 指定头文件搜索路径(mylib.h 所在目录)
-L路径 指定库文件搜索路径
-lmylib 链接库,规则:去掉 lib 前缀和 .a 后缀,即 -l + libmylib.a-lmylib

如果库文件就在当前目录,也可以直接写文件名 gcc main.c mylib.a -o main,更直观。

缺点

  • 使用静态链接生成的可执行文件体积比较大
  • 包含相同的公共代码,造成浪费

关于本文

由 GuQing 撰写,采用 CC BY-NC 4.0 许可协议。