嵌入式Linux编程基础 | GCC 静、动态函数库的创建与链接方法

雾化饼干 / 2024-10-23 / 原文

一、静态库与动态库的区别

库有动态与静态两种,动态通常用 .so 为后缀,静态用 .a 为后缀。例如:libhello.so 表示一个命名为 libhello 的动态库,libhello.a 则是一个命名为 libhello 的静态库。
当使用静态库时,连接器找出程序所需的函数,并将其拷贝到可执行文件,一旦链接成功,静态程序库就不再需要了;而动态库则会在执行程序内留下一个标记指明,当程序执行时,首先必须载入这个库。由于动态库节省空间,linux 下进行连接的缺省操作是首先连接动态库。

二、静态函数库

1. 编译生成 .o 文件

编译当前路径下的所有后缀名为 .c 的源程序文件,生成同名的 .o 目标文件

gcc -c *.c

2. 创建静态库

使用 ar 命令,生成库名为 mytest 的静态函数库 libmytest.a,存放 a.o 和 b.o 两个模块

ar -srv libmytest.a a.o b.o

3. 链接静态库生成可执行文件

链接当前路径下的 libmytest.a 函数库,生成 main.exe 可执行文件

gcc main.o -o main.exe libmytest.a

4. 运行

./main.exe

三、动态函数库

为了方便管理,通常在工程目录下创建 src、inc、lib 等目录,src 目录存放后缀名为 .c 的源程序文件,inc 存放后缀名为 .h 的头文件,lib 存放库文件。以下命令以该目录结构为例嘻嘻~

1. 编译生成.o文件

./src/*.c 表示 src 目录中的所有 .c 文件,-I ./inc 表示将 inc 目录加入到程序头文件目录列表中(inc 目录用于存放 .h 文件)

gcc -c -fPIC ./src/*.c -I ./inc

2. 创建动态库

./lib/libmytest2024.so 表示在 lib 目录下生成 libmytest2024.so 动态库,需要先创建 lib 目录,否则报错没有那个文件或目录。

gcc -shared -fPIC -o ./lib/libmytest2024.so a.o b.o

3. 链接静态库生成可执行文件

-L ./lib/ -lmytest2024 表示将当前目录下的 lib 目录加入到程序函数档案库文件目录列表中,链接名字为 mytest2024 的库文件。默认库文件路径:/usr/lib/

gcc ./src/main.c -o app2024 -L ./lib/ -lmytest2024 -I ./inc

4. 复制静态库到本机的 /lib 目录下

sudo cp ./lib/libmytest2024.so /lib

5. 运行

./app2024

测试代码

1)main.c

#include "a.h"
#include "b.h"
int main() {
  a();
  b();
  return 0;
}

2)a.c

#include <stdio.h>
void a() {
  printf("宫廷玉液酒\n");
}

3)b.c

#include <stdio.h>
void b() {
  printf("一百八一杯\n");
}

4)a.h

#ifndef _a_H_
#define _a_H_
void a();
#endif

5)b.h

#ifndef _b_H_
#define _b_H_
void b();
#endif

 
演示结果
image