当前位置: 首页 > news >正文

_Linux 动态库

文章目录

  • 0. 前言
  • 1. 生成动态库
    • 1.1 我们把静态库和动态库打包
    • 1.2 当动静库同时存在的时候默认生成的是动态库
    • 1.3 -static
  • 2. 动态库的使用
    • 2.1 运行动态库的方法
  • 3. 库文件名称和引入库的名称

0. 前言

链接:静态库文章
上一章我们讲解了静态库的生成和两种使用,我们这章来谈谈动态库。

举个例子:
动态库:在一个100米跑道上中间有两个电线杆相距20米;
静态库:第一个电线杆与终点的距离是60米。

现在我们把跑道改为200米,那么静态库的距离就是错误的,它已经失效了;但动态库的两个电线杆的相对距离不变。

本章演示代码:(就是静态库那章代码)

/mymath.h/
#pragma once
#include<stdio.h>
extern int MyAdd(int a, int b);
/mymath.c/
#include"mymath.h"
int MyAdd(int a, int b)
{
  return a+b;
}

/myprint.h/
#pragma once
#include<stdio.h>
#include<time.h>
extern void MyPrint(const char* str);
/myprint.c/
#include"myprint.h"
void MyPrint(const char* str)
{
  printf("%s[%d]\n", str, (int)time(NULL));
}

///main.c
#include "myprint.h"
#include "mymath.h"
int main()
{  
  MyPrint("hello world");
  int res = MyAdd(1,100);
  printf("res: %d\n", res);

  return 0;
}
————————————————
版权声明:本文为CSDN博主「潜水少年请求出战」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Dingyuan0/article/details/127649870

1. 生成动态库

  • shared: 表示生成共享库格式

  • fPIC:产生位置无关码(position independent code)

  • 库名规则:libxxx.so
    生成动态库的指令如下:

      gcc -fPIC -c mymath.c -o mymath_d.o
      gcc -fPIC -c myprint.c -o myprint_d.o
      gcc -shared mymath_d.o myprint_d.o -o libhello.so
    

上面.o文件前加个_d目的只是为了与上一章静态库生成的.o文件作区别。

1.1 我们把静态库和动态库打包

指令如下:

  mkdir -p output/lib
  mkdir -p output/include
  cp -rf *.h output/include
  cp -rf *.a *.so output/lib

打包后按二叉树分布是下面这个样子:
在这里插入图片描述

1.2 当动静库同时存在的时候默认生成的是动态库

如果只有静态库那就链接的是静态库。
什么意思那?
实操如下:

gcc main.c -I ./output/include/ -L ./output/lib/ -lhello

使用上面的指令我们发现运行可执行文件就出错了
在这里插入图片描述
原因是:默认生成的是动态库,而可执行文件和动态库分批加载到内存中;可是我们只告诉了gcc未告诉系统我们这是一个动态库所以就报错了。
在这里插入图片描述

1.3 -static

那么两个库同时存在,我就想使用静态库,怎么操作的?
只需在原来的指令上加 -static就可以了
在这里插入图片描述

2. 动态库的使用

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

2.1 运行动态库的方法

1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib

  • 就是拷贝到系统路径下,静态库说过,我们不建议这样作。

2、更改 LD_LIBRARY_PATH

[Ding@VM-4-6-centos uselib]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/Ding/my/22116/uselib/output/lib

在这里插入图片描述

3、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

  • 先在 /etc/ld.so.conf.d/ 路径下创个文件(sudo是一个root指令)

    [Ding@VM-4-6-centos uselib]$ sudo touch /etc/ld.so.conf.d/Ding.conf
    
  • 在这个新创的文件下,存动态库的路径就可以了
    在这里插入图片描述

  • 然后跟新一下ldconfig更新

    sudo ldconfig
    

4、动态库与路径建立软链接。
例子:

sudo ln -s /home/Ding/my/22116/uselib/output/lib/libhello.so  /lib64/libhello.so

注意:二、三区别是,二是把环境变量写到内存中,我们退出系统自动就清楚路径了;三是下次登录时,仍然有效。

3. 库文件名称和引入库的名称

  • 如:libc.so -> c库,去掉前缀lib,去掉后缀.so或.a

相关文章:

  • spring5(一):概述
  • C++基础知识梳理<2>(引用、内联函数、auto关键字) [入门级】
  • Halcon图像分割总结
  • 学习笔记-WinRM
  • Java内存模型与volatile
  • LIO-SAM中的mapOptmization
  • Pandas数据处理可视化
  • NA of optical fiber(光纤的数值孔径)
  • 花了整整一天,总结了C语言所有常用的文件操作
  • 2022 年十大 Python Web 开发框架
  • Go语言学习(五)-- 函数和闭包
  • 【数据结构】链表其实并不难 —— 手把手带你实现单链表
  • LeetCode每日一题——754. 到达终点数字
  • 有一个是对的,就是坚持去做难的事情。
  • httpClient同步、异步性能对比
  • 吴峰光杀进 Linux 内核
  • 朋友离职了,一周面试了20多场,我直呼内行
  • 创建 MQTT 连接时如何设置参数?
  • C#基础知识
  • 云原生之快速使用Nacos Spring Cloud