_Linux 动态库

news2024/11/28 0:32:12

文章目录

  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Netty架构设计

目录 Selector模型 SelectableChannel Channel注册到Selector SelectionKey 遍历SelectionKey 事件驱动 责任链模式 Selector模型 Java NIO是基于Selector模型来实现非阻塞IO&#xff0c;Netty底层基于Java NIO实现的&#xff0c;因此也使用了Selector模型。 Selector提…

Go语言五大主流web框架

以下 star数截止2022年11月份 1.Gin&#xff08;64.1K&#xff09; 项目简介&#xff1a;Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API&#xff0c;但性能比 Martini 快 40 倍。 仓库地址&#xff1a;https://github.com/gin-gonic/ginhttps…

TensorRt安装和命令行测试

1、选择TensorRt版本 安装tensorrt前&#xff0c;需要先了解自己的显卡算力、架构等&#xff0c;点击 算力列表链接 对号入座。 这里仅展示RTX和Titan系列&#xff0c;其他系列可在当前网页选择。 1.1、cuda版本 首先需要安装cuda&#xff0c;其版本并不是最新就好&#xf…

基于SSM跨境电商网站的设计与实现/海外购物平台的设计

通过对跨境电商网站的编写&#xff0c;使得自己对于javaweb技术和数据库理论有了更深的认识。课题设计javaweb&#xff0c;能够学习网页编程知识。此课题设计的知识有HTML&#xff0c;CSS和MVC模式等。还跟javaScript的知识有关。在不断的学习过程中提高自己的编程能力。本跨境…

TCP/IP网络参考模型

目录 TCP/IP四/五层模型 应用层常见协议——传输数据PDU 传输层协议——传输数据段 端口号 TCP面向连接服务 UDP无面向连接服务 网络层协议——传输数据包 IP协议 数据链路层——传输数据帧 Ethernet帧格式 IEEE802.3帧格式 TCP/IP四/五层模型 标准定义的TCP/IP模型…

使用idea自动开发springMVC程序及表单标签

1.新建项目 选择Spring—>SpringMVC——>Download 点击next&#xff0c;起好项目名称project name&#xff0c;我这里项目名是MVCTag&#xff0c;选择好项目的路径project location&#xff0c;然后点击确定就会自动加载SpringMVC所需要的全部jar包 项目新建完成&…

【Spring5】基于注解的Bean管理简直是Spring中的Spring

文章目录1 什么是注解2 基于注解方式实现对象的创建3 组件扫描配置的细节4 基于注解实现属性的注入4.1 几种注解概述4.2 Autowire注解演示4.3 Qualifier注解演示4.4 Value注解演示5 纯注解的开发模式写在最后1 什么是注解 注解是代码中特殊的标记&#xff0c;格式如下&#xf…

Latex论文排版

O、部分参考&#xff1a; https://blog.csdn.net/qq_41982200/article/details/123051883?spm1001.2014.3001.5506 https://blog.csdn.net/qq_27353621/article/details/127170340 一、基础知识 1、空一行 → 分一段 空很多行也只是分一段 2、加粗、斜体 3、新章节 4…

JAVA学习笔记(二)

JAVA学习笔记 包1.1基本使用 2.2包的命名 2.3常用的包 2.4使用细节 访问修饰符面向对象 3.1面向对象三大特征 封装、继承、多态 3.2封装介绍 3.3封装的理解和好处 3.4封装的实现步骤 3.5构造器和setXXX结合 3.6继承&#xff08;细节&#xff09; 3.7super基本用法 3.8super给…

Kotlin基础学习笔记之第六章——kotlin的类型系统

一、本章简介 与java相比&#xff0c;kotlin中引入了一些新特性&#xff0c;他们是提升代码可读性的基本要素&#xff0c;比如&#xff1a;对可空的类型和只读集合的支持。与此同时&#xff0c;kotlin去掉了一些java类型系统中不必要的或者有问题的特性&#xff0c;比如把数组作…

docker安装mysql同步数据到linux与docker容器卷

可以去dockerhub搜索mysql寻找命令 docker run -p 3310:3306 --name mysql57 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7 -e配置启动容器mysql 需要配置密码 -v 是绑定容器卷到linux 上 …

阿里二面,前端开发在web3.0中该如何应用,答完面试官对我笑了笑

近期听说周星驰也开始招募web3.0的人才了&#xff0c;可见其火爆程度真是不一般啊&#xff0c;不得不说的是&#xff0c;这又是一场新的革命&#xff0c;必将带来腥风血雨。 对于前端开发来说&#xff0c;很多人可能刚刚准备学习&#xff0c;刚刚入门&#xff0c;刚刚在企业中找…

目标检测(4)—— 经典算法和常用指标

一、深度学习的经典算法 two-stage&#xff08;两阶段&#xff09;&#xff1a;RCNNone-stage&#xff08;一阶段&#xff09;&#xff1a;YOLO&#xff0c;SSD&#xff08;这个好像很牛&#xff09; one-stage&#xff1a; 将图片输入到CNN里&#xff0c;经过特征提取&#…

rabbitMQ:绑定Exchange发送和接收消息(topic)

topic交换机和fanout交换机类似&#xff0c;也是广播机制&#xff0c;但是topic需要绑定RoutingKey&#xff0c;绑定RoutingKey时可以使用通配符&#xff08;*,#&#xff09;代替。 *&#xff1a;只能一个单词 #&#xff1a;0个或多个单词 编写topic消息发送类 1.编写Recei…

区块链的认识

目录 频繁的交易如何记录这些交易信息呢&#xff1f; 那我们的链又是如何连接起来的&#xff1f; 谁做记账先生呢&#xff1f; 共识机制 如何处理有些人距离账目的公共太远的问题&#xff1f; 安全性&#xff1a; 去中心化&#xff1a; 总结&#xff1a; 频繁的交易如何记录…

云原生k8s的盘古开天辟地

背景 容器(docker)流行开来&#xff0c;容器调度机制风起云涌&#xff0c;各路神仙用systemctl调度&#xff0c; 也有号称容器宗师的出品docker swarm, 各大门派也有各自的旗帜主张。天下混沌&#xff0c;血雨腥风&#xff0c;龙藏深泉&#xff0c;而谷歌的k8s就是这个主角。 …

较低成本的ISO7637-2 5A 5B抛负载保护方案

科普下什么是抛负载&#xff0c;抛负载测试方案以及后端电路参数的选择。 在众多汽车电子电磁兼容测试中&#xff0c;最具破坏性的就是ISO7637-2的5A 5B测试了&#xff0c;当然也有的测试项目放在ISO16750标准中&#xff0c;但测试波形大体相同。上海雷卯有专门的文章描述这2个…

基于JavaWeb的手机商城系统设计与实现

目录 摘要 I Abstract II 第1章 绪论 1 1.1 课题背景 1 1.2 目的和意义 1 1.3 系统设计思想 3 1.4 本文的结构 3 第2章 可行性分析 4 2.1 业务流程图 4 2.2 经济可行性 6 2.3 技术可行性 6 2.4 运行可行性 6 2.5 本章小结 7 第3章 需求分析 8 3.1 关于电商的前世今生和目前发展…

C++基础知识梳理<2>(引用、内联函数、auto关键字) [入门级】

目录 一、引用 1. 引用概念 2. 引用特性 2.1 引用在定义时必须初始化 2.2 一个变量可以有多个引用 2.3 引用一旦引用一个实体&#xff0c;再不能引用其他实体 3. 常引用 3.1 取别名的规则 3.2 权限放大error 3.3 权限不变 3.4 权限缩小 4. 引用原理与拓展 4.1…

RestTemplate.exchange各种用法(包括泛型等 --全)

文章目录前言1. Get请求1.1 返回基本类型1.2 返回自定义对象类型1.3 返回List\<T> 类型1.4 返回Map\<K,V> 类型1.5 返回自定义泛型类型2.Post请求2.1 传headerbody返回对象类型2.2 传headerbody返回自定义泛型类型3. 异常情况处理4. RestTemplate配置Bean最后前言 …