_Linux 动态库
创始人
2024-01-20 06:37:03

文章目录

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

0. 前言

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

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

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

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

/mymath.h/
#pragma once
#include
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
#include
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.ogcc -fPIC -c myprint.c -o myprint_d.ogcc -shared mymath_d.o myprint_d.o -o libhello.so
    

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

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

指令如下:

  mkdir -p output/libmkdir -p output/includecp -rf *.h output/includecp -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

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
苁蓉的食用方法 鲜苁蓉的吃法有... 肉苁蓉号称“温而不热,补而不峻,暖而不燥,滑而不泄,故有从容之名。”历来也是传统药食同源的滋补佳品。...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
阳澄湖在哪里哪个省的 阳澄湖是... 点击题目下方苏州生活指南有用 有趣 有态度近期的阳澄湖度很高,3月24日,央视二套《第一时间》直播连...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...