动态库和静态库

 

✅<1>主页::我的代码爱吃辣
<2>知识讲解:Linux——动静态库
☂️<3>开发环境:Centos7
<4>前言:我们之前了解过一点点动静态库,今天系统了解一下。

目录

 一.生成静态库

1.准备工作

2.打包库

 3.如何使用库

3.1指定路径和库名称

3.2放入系统库文件,和头文件目录下

二.生成动态库

1.打包库

2.如何使用库

3.查找动态库

3.1环境变量方案(临时)

 3.2硬连接或者拷贝到系统目录下

 3.3配置文件方案


  1. 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
  2. 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
  3. 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
  4. 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
  5. 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

 见一见库:

库的存放位置一般在,/lib64/或者/usr/lib64下。

动态库和静态库_第1张图片

动态库和静态库_第2张图片

 一.生成静态库

1.准备工作

手写几个简单函数,将其打包成静态库。

add.c

#include "add.h"

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

add.h

#pragma once

int add(int a, int b);

sub.c

#include "sub.h"

int sub(int a, int b)
{
    return a - b;
}

sub.h

#pragma once

int sub(int a, int b);

mian.c

#include 
#include "add.h"
#include "sub.h"

int main()
{

    printf("%d\n", add(20, 10));
    printf("%d\n", sub(20, 10));

    return 0;
}

2.打包库

生成静态库,需要使用汇编之后的.o的二进制目标文件。使用

gcc -c

ar是gnu归档工具,rc表示(replace and create)。

动态库和静态库_第3张图片

 打包库:

使用命令

ar -rc [libmymath.a]

libmymath.a是库的名称,库的命名格式是:

lib+真是库名+.a,lib代表这是一个库,中间是哭的名称,.a代表静态库。

动态库和静态库_第4张图片

 3.如何使用库

3.1指定路径和库名称

如果我们直接对main.c文件使用gcc编译 :

会发现,编译器还是找不到库,所以这里的会有链接错误,add,sub,未定义。

 指定库和库的所在路径:

gcc -o main mian.c -L [路径] -l [库名]

动态库和静态库_第5张图片

 这次生成的是静态库,即使我们删除库本身,可执行程序依旧可以继续跑。

动态库和静态库_第6张图片

3.2放入系统库文件,和头文件目录下

创建include和lib文件夹,将.h文件放进include文件夹中,将.o文件放进lib文件夹中。

直接指定头文件夹,库文件夹,库名称:

gcc -o main main.c -I [头文件路径] -L [库文件路径] -l [库名称]

动态库和静态库_第7张图片

 也可以直接将include和lib放进系统的目录下:

将头文件放进/usr/include下,将库文件放进/lib64下。

二.生成动态库

  • shared: 表示生成共享库格式
  • fPIC:产生位置无关码(position independent code)
  • 库名规则:libxxx.so

1.打包库

 gcc 自带打包动态库的功能:

生成与位置无关码

使用命令:

gcc -fPIC -c [.c文件]

打包成动态库

 使用命令:

gcc -shared -o [库名] *.o

2.如何使用库

  1.  l:链接动态库,只要库名即可(去掉lib以及版本号)
  2. L:链接库所在的路径.

 创建include和lib文件夹,将.h文件放进include文件夹中,将.o文件放进lib文件夹中。

使用命令:

gcc -o main main.c -I [头文件路径] -l[库名] -L [库路径]

动态库和静态库_第8张图片

说明:

  1. 发现无法运行,还是找不到动态库
  2. 动态库OS会有默认的搜索路径,我们仅仅是给gcc指定了路径,并没有告诉OS。

3.查找动态库

3.1环境变量方案(临时)

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:[库的路径]

 3.2硬连接或者拷贝到系统目录下

 3.3配置文件方案

/etc/ld.so.conf.d/目录下的文件用来指定动态库搜索路径。这些文件被包含在/etc/ld.so.conf文件中,ldconfig命令会在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索可共享的动态链接库,并创建出动态装入程序(ld.so)所需的连接和缓存文件。

你可能感兴趣的:(linux,运维,服务器)