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

news2024/11/25 6:27:57
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 ./ -lSoTest
	sudo cp libSoTest.so /lib/
	lld main

libSoTest.so:
	${CXX} -shared -fPIC SoTest.cpp -o $@

clean:
	${RM} *.so main
	sudo rm -rf /lib/libSoTest.so

在这里插入图片描述

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

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

相关文章

字符串的遍历,统计,反转.java

题目&#xff1a;键盘输入字符串&#xff0c;统计字符串所包含的大小写字母个数&#xff0c;及数字个数 分析&#xff1a;键盘输入字符串需next&#xff08;&#xff09;方法&#xff0c;利用fot循环遍历每个字符&#xff0c;返回字符串上的字符用charAt&#xff08;index&…

图论-最短路

一、不存在负权边-dijkstra算法 dijkstra算法适用于这样一类问题&#xff1a; 从起点 start 到所有其他节点的最短路径。 其实求解最短路径最暴力的方法就是使用bfs广搜一下&#xff0c;但是要一次求得所有点的最短距离我们不可能循环n次&#xff0c;这样复杂度太高&#xf…

Mac air 个人免费版VMWare Fusion安装及配置教程

Mac air 安装免费版VMWare Fusion教程及问题解决 1、下载VMWare Fusion2、下载wins镜像文件3、开始配置4、出现的问题及解决方法4.1 如何跳过启动时的网络连接4.2 启动后&#xff0c;无法连接网络怎么办4.3 怎么实现将文件拖拽到虚拟机中 当你手上是一台Mac电脑&#xff0c;却需…

薪酬、人数上不封顶,这家互联网大厂正在疯抢超级毕业生

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 又是一年一度校园春招季。在生成式 AI 一路狂飙的时代浪潮下&#xff0c;人工…

Linux: 进程地址空间究竟是什么?进程地址空间存在意义何在?

Linux: 进程地址空间究竟是什么&#xff1f; 一、内存究竟是什么&#xff1f;分为哪些&#xff1f;二、内存是真实物理空间&#xff1f;三、进程地址空间&#xff08;虚拟地址&#xff09;3.1 为何同一个变量地址相同&#xff0c;保存的数据却不同&#xff1f; 四、为什么需要地…

ssm012医院住院管理系统+vue

医院住院管理关系 摘 要 随着时代的发展&#xff0c;医疗设备愈来愈完善&#xff0c;医院也变成人们生活中必不可少的场所。如今&#xff0c;已经2021年了&#xff0c;虽然医院的数量和设备愈加完善&#xff0c;但是老龄人口也越来越多。在如此大的人口压力下&#xff0c;医院…

3.31总结

这两天对于java知识的学习又收获了一些新的东西&#xff0c;如内部类、抽象类、接口、权限修饰符、代码块、final. final final多用于方法、类、变量的修饰 方法&#xff1a;表示该方法是最终方法&#xff0c;不能被重写 类&#xff1a;表明该类是最终类&#xff0c;不能被…

latex伪代码一些记录

参考一 参考二 参考三 使用minipage 最终调整好的效果&#xff1a; $ \begin{document} \begin{center} \begin{minipage}{15.92cm} \renewcommand{\thealgorithm}{1} \begin{CJK}{GBK}{song} \begin{algorithm}[H]\caption{ \text{算法1&#xff1a;xxx}}\begin{algorith…

Linux 基础IO [缓冲区文件系统]

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 一.Linux下一切皆文件 二.缓冲…

调试技巧安全预编译头文件(C++基础)

调试 调试可以选择条件调试和操作调试&#xff1a; 条件调试来选择条件进入断点设置&#xff0c;操作调试来使达到断点条件后完成某些操作&#xff08;一般是output窗口输出&#xff09;。 在这里就只输出了小于6的条件。 安全 降低崩溃、内存泄露、非法访问等问题。 应该转…

vue基础教程(5)——构建项目级登录页

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、创建首页二、登录页代码讲解三、对应的vue知识点&#xff1a;四、附件-各文件代码总结 前言 前面我们已经把vue自带的页面删除&#xff0c;也搭建了最简单的router路由&#xff0c;下面就可以真正开发我们自己的项目…

蓝桥杯-python-常用库归纳

目录 日期和时间 datetime模块 date日期类&#xff0c;time时间类&#xff0c;datetime日期时间类 定义date&#xff08;年&#xff0c;月&#xff0c;日&#xff09; data之间的减法 定义时间&#xff08;时&#xff0c;分&#xff0c;秒&#xff09; 定义datetime&#xf…

文献学习-23-MRM:用于遗传学医学图像预训练的掩码关系建模

MRM: Masked Relation Modeling for Medical Image Pre-Training with Genetics Authors: Qiushi Yang, Wuyang Li, Baopu Li, Yixuan Yuan Source: ICCV 2023 Abstract: 关于自动多模态医疗诊断的 ODERN 深度学习技术依赖于大量的专家注释&#xff0c;这既耗时又令人望而却…

DeepL Pro3.1 下载地址及安装教程

DeepL Pro是DeepL公司推出的专业翻译服务。DeepL是一家专注于机器翻译和自然语言处理技术的公司&#xff0c;其翻译引擎被认为在质量和准确性方面表现优秀.DeepL Pro提供了一系列高级功能和服务&#xff0c;以满足专业用户的翻译需求。其中包括&#xff1a; 高质量翻译&#xf…

Python 常用内置库 time库、random库、turtle库

文章目录 一、time库二、random库三、turtle库1. 绘制正方形2. 使用海龟对象绘制六边形3. 绘制多个起点相同大小不同起点的五角星4. 绘制多个图形和添加文字 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、time库 time是最基础的时间处理库&#…

系统慢查询的思考

系统慢查询的思考 在一个系统中发现慢查询的功能或很卡的现象。你是怎么思考的&#xff1f;从哪几个方面去思考&#xff1f;会用什么工具&#xff1f; 一个系统使用了几年后都可能会出现这样的问题。原因可能有以下几点。 数据量的增加。系统中平时的使用中数据量是有一个累…

HTML块级元素和内联元素(头部和布局)

目录 1.HTML块级和内联标签&#xff1a; 1.块级元素&#xff1a; 2.内联元素: 3.元素嵌套&#xff1a; 4.元素转换&#xff1a; 示例如下: 2.内联框架&#xff1a; 前言&#xff1a; 示例如下: 3.布局&#xff1a; 4.头部标签&#xff1a; 前言&#xff1a; 说明&…

GT收发器PHY层设计(3)PHY层设计

文章目录 前言一、设计框图二、PHY层基本传输协议三、PHY_TX模块3.1、模块接口3.2、组帧状态机描述3.3、数据大小端问题3.4、字节对齐 四、PHY_RX模块4.1、模块接口4.2、大小端转换4.3、起始位4.4、结束位4.5、axis数据流恢复 五、LFSR伪随机码六、链路空闲时期处理 前言 上一…

windows平台虚拟机安装

windows平台虚拟机安装 1. 安装VMwareWorkstationPro 1.1 软件下载 官网下载 官网 百度网盘下载 版本 VMwareWorkstationPro16 链接&#xff1a;https://pan.baidu.com/s/1LidMxoM9e4a4CANixyRoyg?pwd1157 提取码&#xff1a;1157 1.2 软件安装 软件安装注意事项 软件…

类的新功能

类的新功能 默认成员函数 在C11之前&#xff0c;一个类中有如下六个默认成员函数&#xff1a; 构造函数。拷贝构造函数赋值重载析构函数取地址重载函数const取地址函数 其中前四个默认成员函数最重要&#xff0c;后面两个默认成员函数一般不会用到&#xff0c;这里默认成员…