Makefile:动态库的编译链接与使用(六)

1、动态链接库

动态链接库:不会把代码编译到二进制文件中,而是运行时才去加载,所以只需要维护一个地址

  • 动态:运行时才去加载,即所谓的动态加载
  • 连接:指库文件和二进制程序分离,用某种特殊的手段维护二者之间的关系
  • 库:Windows下为.dll库文件,Linux下为.so库文件

动态链接库文件的好处是程序和库文件分离,可以分别发行,库文件可以被多处共享

2、动态库的制作与使用
2.1、制作一个动态库
  • 首先生成一个SoTest.h、SoTest.cpp分别存放类声明和定义

    // 声明一个抽象类,因为有纯虚函数
    class SoTest {
    public:void func1();virtual void func2();virtual void func3() = 0;
    };// 实现
    #include "SoTest.h"
    #include <iostream>void SoTest::func1() {std::cout << "func1()" << std::endl;
    }void SoTest::func2() {std::cout << "func2()" << std::endl;
    }
    
  • 执行编译命令生成一个动态链接库

    g++ -shared -fPIC SoTest.cpp -o libSoTest.so
    

    此时当前目录下会生成一个 libSoTest.so的文件表示动态库

    • -shared指令:表示这是一个共享库
    • -fPIC指令:PIC(Position Independent Code)地址无关代码,加入这个指令后生成的动态库不需要进行任何的修改被加载到任意内存地址都是能够正常运行的。(后面在展开说)
    • 动态库的命名规则很奇葩,其实在/user/local/lib等Linux的文件夹下经常可以看到libxxx.so的文件
      • lib是一种大家默认的命名规范,但是最后加载的时候又会去掉这个lib,只能说很奇葩
      • .so是表示这是一个动态库
    • -l(小写L):指定动态库的文件的名称,名称需要去掉lib和.so,如上!
    • -I(大写i):指定头文件目录,默认为当前目录
    • -L:手动指定动态库库文件搜索目录,默认只链接共享目录(系统的lib动态库),运行的时候还需要指定一次
2.2、编写程序使用动态库
  • 首先准备一个main.cpp引入SoTest.h头文件,对SoTest进行继承并且重写几个函数

    #include <iostream>
    #include "SoTest.h"class Test: public SoTest{
    public:void func2() override {std::cout << "Test::func2()" << std::endl;}void func3() override {std::cout << "Test::func3()" << std::endl;}
    };int main() {Test test;test.func1();test.func2();test.func3();std::cout << "Hello, World!" << std::endl;return 0;
    }
    
  • 使用下面的指令进行编译

    g++ main.cpp -o main -L ./ -l SoTest
    
2.3、运行时动态库的连接
  • Linux默认动态库路径配置文件:
/etc/ld.so.conf       /etc/ld.so.conf.d/*.conf/lib/*        /usr/lib        /usr/local/lib
...

上面的指令只是在编译时对这个动态库进行了链接,但是运行时是找不到的了,因此运行的时候会报错,报错原因:

  • 链接器:工作于链接阶段,工作时需要-l和-L分别指定库名和动态库路径
  • 动态链接器:工作与程序运行阶段,工作时需要提供动态库所在目录位置,而动态库加载,程序是默认从几个系统指定的位置加载这个libSoTest.so文件。
  • 当前位置的加载,因此需要给给定一个路径使得系统能够加载到动态库,通过ldd main可以看到找不到这个库
    在这里插入图片描述
2.4、解决方法

解决方法其实还是蛮多的,大概有3-4种的样子

  • 方案一:
    export LD_LIBRARY_PATH=./(动态库路径),这是临时环境变量,关闭bash就不会有了
  • 方案二:
    将动态库路径写入环境变量.bashrc作为永久环境变量(bash启动就有)
  • 方案三:
    拷贝自定义动态库到系统/lib或者其他一些指定的系统加载lib下
  • 方案四:
    sudo vim /etc/ld.so.conf
    写入绝对路径
    sudo ldconfig -v 使得配置文件生效

不管上面那种写法,最后lld main都能看到对应的libSoTest.so的路径在哪

2.5、Makefile
main: libSoTest.so${CXX} main.cpp -o main -L ./ -lSoTestsudo cp libSoTest.so /lib/lld mainlibSoTest.so:${CXX} -shared -fPIC SoTest.cpp -o $@clean:${RM} *.so mainsudo rm -rf /lib/libSoTest.so

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL - 高阶语句(一)

先准备一张表 create table class1 (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5));insert into class1 values(1,liuyi,80,beijing,2); insert into class1 values(2,wangwu,90,shengzheng,2); insert into class1 …

图腾柱PFC:HP1010为您的电动两轮车之旅提供绿色,高效,安全的动力

电动两轮车不仅为当今生活提供了便利&#xff0c;更是一种健康和绿色的出行方式。想象一下&#xff0c;在经过一整晚的充分休息&#xff0c;骑上爱车&#xff0c;满血复活的准备开始新的一天。您会愿意带着如何给心爱的两轮车充电的担心开始这一天吗&#xff1f; 随着越来越…

第1章.提示词:开启AI智慧之门的钥匙

什么是提示词&#xff1f; 提示词&#xff0c;是引导语言模型的指令&#xff0c;让用户能够驾驭模型的输出&#xff0c;确保生成的文本符合需求。 ChatGPT&#xff0c;这位文字界的艺术大师&#xff0c;以transformer架构为基石&#xff0c;能轻松驾驭海量数据&#xff0c;编织…

JUC并发编程(七)

1、不可变对象 1.1、概念 不可变类是指一旦创建对象实例后&#xff0c;就不能修改该实例的状态。这意味着不可变类的对象是不可修改的&#xff0c;其内部状态在对象创建后不能被更改。不可变类通常具有以下特征&#xff1a; 实例状态不可改变&#xff1a;一旦不可变类的对象被…

中药知识分享

中药知识分享 声明&#xff1a;本文根据《懒兔子》公众号公益视频整理&#xff0c;参考网络信息略有改动&#xff0c;图片来源于网络&#xff0c;如有侵权&#xff0c;请联系删除。文章内容如有不正确之处请指正批评。仅供学习使用。请勿擅自服用本文提及的药材&#xff0c;否…

http响应练习—在服务器端渲染html(SSR)

一、什么是服务器端渲染&#xff08;SSR&#xff09; 简单说&#xff0c;就是在服务器上把网页生成好&#xff0c;整个的HTML页面生成出来&#xff0c;生成出的页面已经包含了所有必要的数据和结构信息&#xff0c;然后直接发给浏览器进行展现。 二、例题 要求搭建http服务&a…

pymysql使用记录

最近由于需要来学习一下pymysql。 先来认识一下pymysql&#xff1a; PyMySQL 是 Python 中一个用于连接 MySQL 数据库的库。它允许 Python 程序通过简单的 API 调用来连接、操作和管理 MySQL 数据库。PyMySQL 是在 Python 中使用纯 Python 编写的&#xff0c;因此它可以在几…

2024/3/31周报

文章目录 摘要Abstract文献阅读题目创新点实验数据研究区域数据和材料 方法XGBoost algorithmLong Short‑Term Memory AlgorithmEvaluation of the Model Accuracy 实验结果 深度学习XGBoost代码实现AdaBoostBoostingAdaBoost算法AdaBoost代码实现 总结 摘要 本周阅读了一篇基…

Mamba: Linear-Time Sequence Modeling with Selective State Spaces(论文笔记)

What can I say? 2024年我还能说什么&#xff1f; Mamba out! 曼巴出来了&#xff01; 原文链接&#xff1a; [2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Mamba: Linear-Time …

NFC RC522开发记录

文章目录 一、ID卡、IC卡(M1卡、CPU卡)的区别二、RC522读写操作1. 数据读写流程三、RC522驱动代码1. RC522 与 STM32 的接线图2. RC522.c3. RC522.h4. main.c一、ID卡、IC卡(M1卡、CPU卡)的区别 ID卡 :只存储了ID号,设备识别ID号,没有算法可言,容易复制,安全性低IC卡包含了…

Unity-C#进阶——3.27更新中

文章目录 数据结构类ArrayListStackQueueHashtable 泛型泛型类、泛型方法、泛型接口ListDictionaryLinkedList泛型栈&#xff0c;泛型队列 委托和事件委托事件匿名函数Lambad 表达式**闭包** List 排序逆变协变多线程进程线程多线程方法&#xff1a;线程之间共享数据&#xff1…

洛谷_P2437 蜜蜂路线_python写法_高精度加法

目录 1. 40分代码 2.高精度加法 3.全AC代码 4.惊掉下巴的解法 P2437 蜜蜂路线 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 1. 40分代码 m, n map(int,input().split())ans 0 d [1,2] flag [0 for _ in range(n1)] def fun(step):global ansif step n:ans 1return…

订单系统-RPC快速入门

RPC快速入门 概述 关于rpc&#xff0c;只需要知道他是一种协议&#xff0c;项目之间能够远程调用函数。 快速入门 我们前边下载好的两个包&#xff0c;在idea中打开之后&#xff0c;我们创建这么几个文件夹。 至于是干什么的&#xff0c;以后细说。创建好之后我们在produc…

数据结构--单链表(c语言实现)

一.单链表的设计 1.单链表的结构定义: typedef struct Node{int data;//数据域struct Node* next;//后继指针 }Node,*List; 2.单链表的设计示意图: 3.注意,单链表的最后一个节点的next域为NULL; 4.为什么要有一个头节点?(简单方便,不用传二级指针); 二.单链表的实现 //初始化 …

SQL中的UNION和UNION ALL

SQL中的UNION和UNION ALL是用来合并两个或更多SELECT语句结果集的运算符。它们的主要区别在于是否去除重复行以及是否执行排序操作。 UNION&#xff1a; - UNION操作符用于合并两个或多个查询结果集&#xff0c;形成一个新的结果集。 - 它会自动删除结果集中的重复行&#xf…

C语言操作符详细讲解

前言 本次博客一定会让刚刚学习C语言小白有所收获 本次操作符讲解不仅分类还会有代码示例 好好看 好好学 花上几分钟就可以避免许多坑 1 操作符的基本使用 1.1操作符的分类 按功能分 算术操作符&#xff1a; 、- 、* 、/ 、% 移位操作符: >> << 位操作符…

PTA-练习9

目录 实验10-4 递归实现顺序输出整数 实验10-10 十进制转换二进制 实验10-6 递归求简单交错幂级数的部分和 实验11-1-2 输出月份英文名 实验11-1-6 指定位置输出字符串 实验11-1-8 查找子串 递归的基本思路&#xff1a; 推出递归的条件或者进入递归的条件每层递归需要执行…

【MySQL】内外连接——内连接、外连接、左外连接、右外连接、内外连接的区别、左外连接和右外连接的区别

文章目录 MySQLMySQL表的内连接和外连接1. 内连接2. 外连接2.1 左外连接2.2 右外连接 3. 内外连接的区别4. 左外连接和右外连接的区别 MySQL MySQL表的内连接和外连接 MySQL 中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;包括左外连接 LEFT JOIN 和右外连…

【Web应用技术基础】CSS(4)——背景样式

第1题&#xff1a;背景颜色 .html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Hello World</title><link rel"stylesheet" href"step1/CSS/style.css"> </head><body>&…

左侧或水平导航菜单栏与main区域联动

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、左侧导航菜单栏与main区域联动 文章目录 系列文章目录前言一、实现步骤1.<el-menu>中设置属性router为true2.<el-menu-item>中设置路由 route"/"3.<el-main>里设置路由出口4…