静态库与共享库 --- Linux

库文件:特定功能的实现,为用户提供一些调用接口
libc
: printf scanf malloc free
stdio.h malloc.h 函数声明
编译
连接 符号解析 找到符号对应的定义位置

数据结构
顺序表 链表 队列 栈 二叉树
C++ STL标准模板库 容器

1、静态库,动态库在Windows和Linux下的区别:
静态库 动态库
Windows .lib .dll
Linux .a .so

静态库
1、 功能代码编译成中间文件
gcc –c *.c --> *.o
2、命令 ar
ar crv libxxx.a *.o
3、使用
gcc -o main main.c -L库的存储路径 -l库文件的名称

共享库(动态库)
1、 生成共享库
gcc -shared -fPIC –o libxxxx.so 源文件列表

2、 使用
gcc -o main main.c -L库的存储路径 -l文件的名称(与静态库相同)

区别:
(1) 静态库类似于中间文件的集合,是不可执行的,
共享库是一个不可执行的可执行文件
(2) 静态库是在连接时,将静态库中的内容合并到最终的可执行文件中,所以程序执行时,不需要依赖静态库。
动态库是在程序运行时,由操作系统加载库文件到内存上去执行,最终生成的程序中根本没有库文件中的内容
(3) 更新库中的功能,如果是静态库,必须重新编译可执行文件
如果是共享库,只需要更新共享库就可以。

3、 通过LD_LIBRARY_PATH环境变量给操作系统指定加载共享库的路径
(1)直接在终端上修改 export LD_LIBRARY_PATH=库的路径:.
仅对当前终端有效,当终端关闭或者系统重启,则设置的环境变量就不存在了
(2)修改配置文件 /etc/bashrc
Export LD_LIBRARY_PATH=库的路径:.
(3) 将生成的共享库存储到系统默认的搜索路径下 /lib /usr/lib

Linux中利用静态库和动态库对代码的实现
静态库 共享库
MyMath.h List.h 函数的声明
MyMath.c List.c 函数的实现

main.c 测试主函数

静态库:

  1. gcc -c List.c MyMath.c 生成中间文件
    List.o MyMath.o

  2. ar crv libxxxx.a List.o MyMath.o
    ---->libxxx.a 静态库

  3. gcc -o main main.c -L. -lxxxx
    ----> main

    ./main

命令:

touch MyMath.c  MyMath.h
vim MyMath.c

在这里插入图片描述

vim MyMath.h

在这里插入图片描述

gcc -c  MyMath.c  生成中间文件mymath.o
vim main.c

在这里插入图片描述

ar cro libMyMath.a *.o      创建一个libMyMath.a文件
gcc -o main main.c -L -lMyMath      生成一个main文件
./main ----->得出main中的运算结果

在这里插入图片描述
动态库(共享库):

  1. gcc –shared –fPIC –o libxxx.so MyMath.c List.c
    ----> libxxxx.so 动态库
  2. gcc -o main main.c -L. –lxxxx
    ----> main
  3. 修改环境变量
    export LD_LIBRARY_PATH=.
    ./main

命令:

mkdir so  创建so目录文件
ls
cp *.c  *.h so
cd so    进入so目录文件

在这里插入图片描述

gcc  –shared  -fPIC  –o  libMyMath.so  MyMath.c    生成libMyMath.so文件

在这里插入图片描述
ll 查看文件大小
在这里插入图片描述

./libMyMath.so   执行libMyMath.so文件中的内容

在这里插入图片描述
记忆体区段错误
(注:libMyMath.so文件是一个不可执行的可执行文件,所以需与main文件联系起来)

gcc  -o  main  mian.c  -L.  –lMyMath    生成main文件

在这里插入图片描述

./main    执行main 中的内容

在这里插入图片描述
(会出现如上的错误,需对环境变量进行修改)

export LD_LIBRARY_PATH=.    修改环境变量

./main    执行main文件

在这里插入图片描述

cd ..  从so目录文件中退出
发布了17 篇原创文章 · 获赞 4 · 访问量 1599

猜你喜欢

转载自blog.csdn.net/qq_43411866/article/details/90111181