动态库与静态库

1. 库

是代码的二进制的封装形式
在其他的源代码或库中,可以直接调用库的,但是又看不到它  
没有公开源代码

库的这种实现方法有利于模块化 而且只要接口合理
不影响库的使用的

sum.c  sum.h

int sum(int a,int b) {
    return a+b;
}

xxx.c
    需要使用sum 原来的做法 就是直接把源代码拷贝
    
(1)
    直接给源代码,不利于知识产权的保护
    想给你用,但是又让你知道,到底如何去实现的
(2)
    加入有一天,sum文件的实现,更新换代了,使用sum的代码,需要重新编译,打包,下载

现在: 使用库

sum.c  sum.h

int sum(int a,int b) {
    return a+b;
}


编译,生成libxxxx.so(库的二进制)

xxx.c
       想要去使用sum,直接链接到libxxx.so
                =>a.out 运行a.out 加载libxxxx.so就可以了


    动态库 和 静态库

2. 动态库

动态库的使用步骤
1. 制作动态库
            a.编辑源代码(库的代码)
                        如:
                                    LinkedList.c 功能函数的实现
                                    LinkedList.h 接口文件
            
                                    库的源代码 不能包含 main函数
            b.生成动态库
                        gcc(arm-linux-gcc) -shared -fpic -o libLinkedList.so LinkedList.c(可以根据自己需要多加其他的.c)
                        把LinkedList.c编译成动态库,生成的动态库的名字 libLinkedList.so
                                    -shared   生成动态库
                                     -fpic       与位置无关
                                      -o          指定生成动态库的名字
                                                动态库的名字 一般都只以lib开头,以.so结尾的文件
                                                 lib[0-9a-zA-Z]+\.so

2. 使用动态库
            a.把头文件和库拷给需要的人
                        xxx.c
                            <------LinkedList.h
                            <------libLinkedList.so
        
        gcc xxx.c -I 目录1 -I 目录2 ...... -L 目录名字 -l LinkedList -o xxx
                    -I(i的大写)    接一个目录名,指定的头文件的搜索路径,可以接多个-I inlcude 
                    -L                      接一个目录名,指定后面的那个库的搜索路径
                    -l                       库名,把lib .so去掉所剩下的就是库名
        
             eg:
                    gcc xxx.c -I ../ -L ../ -l LinkedList -o xxx
                    执行上面的命令,会生成可执行文件xxx 并且这个可执行文件xxx 会使用到库libLinkedList.so
                    但是在生成xxx的时候,并没有把动态库中内容拷贝到xxx中,只是标记
                                xxx的运行,需要库的支持的
            
            ./link: error while loading shared libraries: libLinkedList.so: cannot open shared object file: No such file or directory
      
      b. 最终运行使用库的那个可执行文件前,确保依赖库在
          运行的系统中,只打需要在哪一个目录下搜索依赖库
          
          环境变量
                   LD_LIBRARY_PATH
                          LD:loading 加载依赖库的路径
                  
                export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的依赖库的路径 绝对路径
                 or
                 把依赖库,直接丢到LD_LIBRARY_PATH指定的路径中去
                                          /usr/lib/

3. 静态库

1.制作静态库
         1)编辑源代码
    
         2)把所有的源代码编译成.o
                gcc(arm-linux-gnueabi-gcc) -c xxx.c -o xxx.o
         3)用ar命令把所有的.o文件打包,生成静态库
                    (arm-linux-gnueabi-)ar -rcs libxxxx.a a.o b.o
                             -r 更新
                             -c 创建
                             -s 创建索引
                     把a.o b.o打包生成静态库 
                     libxxxx.a

2.使用
         1)把静态库和头文件拷贝给别人
                     gcc(arm-linux-gnueabi-gcc) main.c -I ... -L ... -l xxxx -o main
    
          2)直接把可执行文件下载到开发板,运行

4. 动态库与静态库的区别

二进制的封装
区别:
        对于动态库,对使用动态库的代码 编译 并没有把动态库编译进去
         仅仅做一个标记:我的这个可执行程序在运行,会用到某某某动态库
    
         对于静态库,对使用静态库的代码 编译,只把静态库的内容拷贝到可执行文件当中
    
动态库的优点    
          当接口一致(函数名 参数 返回值)的时候,更新动态库,不需要重新编译依赖动态库的可执行程序  a.out
           静态库 修改,则需要重新编译所依赖的可执行程序

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

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

相关文章

LuatOS-SOC接口文档(air780E)--rtc - 实时时钟

rtc.set(tab) 设置时钟 参数 传入值类型 解释 table or int 时钟参数,见示例 返回值 返回值类型 解释 bool 成功返回true,否则返回nil或false 例子 rtc.set({year2021,mon8,day31,hour17,min8,sec43}) --目前只有Air101/Air103/Air105/EC618系列支持时间戳方式 rt…

QT中的 容器(container)-大全

一、介绍 Qt库提供了一套通用的基于模板的容器类&#xff0c;可以用这些类存储指定类型的项。比如&#xff0c;你需要一个大小可变的QString的数组&#xff0c;则使用QVector<QString>。 这些容器类比STL&#xff08;C标准模板库&#xff09;容器设计得更轻量、更安全并…

光伏电站开发流程

随着人们对可再生能源的关注度不断提高&#xff0c;光伏电站的开发流程也变得越来越重要。光伏电站是一种利用太阳能发电的设施&#xff0c;它可以有效地减少化石能源的消耗&#xff0c;同时也可以为环保事业做出贡献。 首先&#xff0c;要进行光伏电站的开发&#xff0c;需要选…

PWM 正玄波形 通过C语言生成

#include <stdio.h> #include <math.h> #include <stdint.h>#define SAMPLE_POINT_NUM (200) /* 需要生成的点的个数 */ #define SINE_MAX (255) /* sin 函数幅值 */ #define PI (3.14…

pytorch训练模型内存溢出

1、训练模型命令命令 如下所示是训练命名实体识别的命令&#xff0c;在win10系统下执行 activate pytorch cd F:\Python\github\ultralytics-main\submain\pytorch_bert_bilstm_crf_ner-main f: python main.py --bert_dir"../model_hub/chinese-bert-wwm-ext/" --…

TIME_WAIT状态TCP连接导致套接字无法重用实验

理论相关知识可以看一下《TIME_WAIT相关知识》。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include<errno.h> #include<syslog.h> #inc…

Echarts legend图例配置项 设置位置 显示隐藏

Echarts 官网完整配置项 https://echarts.apache.org/zh/option.html#legend 配置项 legend: { }设置图例为圆形 icon: circle,//设置图例为圆形设置图例位置 top: 20%//距离顶部百分之20//y:bottom 在底部显示设置图例 宽度 高度 itemWidth: 10,//设置图例宽度 itemHeight: …

Dubbo相关的问题

Dubbo 失败机制 Dubbo 是一个 RPC 框架&#xff0c;它为我们的应用提供了远程通信能力的封装&#xff0c;同时&#xff0c;Dubbo 在 RPC 通信的基础上&#xff0c;逐步在向一个生态在演进&#xff0c;它涵盖了服务注册、动态路由、容错、服务降级、负载均衡等能力&#xff0c;…

每日一练【移动零】

一、题目描述 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 二、题目解析 可以…

Python中调用VisualStudio创建的DLL库

1、创建DLL 打开VisualStudio2022&#xff0c;创建新项目 动态链接库-下一步 设置项目名称、项目位置、创建 单击头文件、添加、新建项 选择.h、设置名称、添加 同样的在源文件新建项&#xff0c;创建 代码&#xff1a; test.h #pragma once#ifdef BUILD_TEST #define API_S…

unity3d NPC自动寻路不移动

烘焙的路面不能有间隔&#xff0c;调整地面重新烘焙

数据结构(超详细讲解!!)第二十五节 树与森林

1.树的存储结构 和线性表一样&#xff0c;树可以用顺序和链式两种存储结构。 树的顺序存储结构适合树中结点比较“满”的情况。根据树的非线性结构特点&#xff0c;常用链式存储方式来表示树。树常用的存储方法有&#xff1a;双亲表示法、孩子表示法和孩子兄弟表…

【Linux进阶之路】进程间通信

文章目录 一、原理二、方式1.管道1.1匿名管道1.1.1通信原理1.1.2接口使用 1.2命名管道 2.共享内存2.1原理2.2接口使用 3.消息队列原理 4.信号量引入原理 总结 一、原理 进程间的通信是什么&#xff1f;解释&#xff1a; 简单理解就是&#xff0c;不同进程之间进行数据的输入输出…

18、Android 组件化

Android 组件化架构设计从原理到实战-CSDN博客 Android组件化架构解析总结_android 组件化架构_PalmerYang的博客-CSDN博客 Android组件化开发&#xff0c;从未如此简单 - 知乎

Typora+PicGo+Minio搭建博客图床

文章目录 TyporaPicGoMinio搭建博客图床前言什么是图床?为什么需要图床?准备工作一、Typora二、Picgo1. 下载Picgo2. 下载node.js3. 下载minio插件 三、服务器端配置1. 添加端口到安全组2. 使用Docker安装minio3. 配置minio image-20231127175530696四、minio插件配置五、Typ…

PTA:编程实现字符串连接函数MyStrNcat (C语言)

题干 本题要求实现一个函数&#xff0c;即字符串“n”族连接函数StrNcat&#xff0c;将两个字符串连接起来。 函数接口定义&#xff1a; char *MyStrNcat( char *dst, char *src, int n ); 此函数把字符串src中的前n个字符连接到到dst后面&#xff0c;并以’\0’终止该串&…

C++ day37 贪心算法 单调递增的数字 监控二叉树

题目1&#xff1a;738 单调递增的数字 题目链接&#xff1a;单调递增的数字 对题目的理解 返回小于或等于n的最大数字&#xff0c;且数字是单调递增&#xff08;单调递增数字的定义&#xff1a;每个相邻位上的数字满足x<y&#xff09; 贪心算法 注意本题的遍历顺序是从…

【带头学C++】----- 八、C++面向对象编程 ---- 8.1 面向对象编程概述

目录 8.1 面向对象编程概述 8.1.1 面向对象概念&#xff08;OOP&#xff09; 8.1.2 面向过程概念 8.2 :: 作用域运算符 8.3 命名空间namespace 8.3.1 C的命名空间 namespace 8.3.2 命名空间 namespace使用语法 1. 创建一个命名空间&#xff1a; 2. 命名空间只能在全局…

WIN10 x86环境部署ARM虚拟机(银河麒麟)

我们经常使用的是x86架构的cpu&#xff0c;而对于不同cpu架构的arm架构的操作系统&#xff0c;我们可以通过QEMU模拟器来进行模拟一个arm环境 1、部署前的准备 arm的镜像&#xff1a; 以此镜像为例&#xff1a;Kylin-Server-10-SP2-aarch64-Release-Build09-20210524.iso QE…

Co-DETR:DETRs与协同混合分配训练论文学习笔记

论文地址&#xff1a;https://arxiv.org/pdf/2211.12860.pdf 代码地址&#xff1a; GitHub - Sense-X/Co-DETR: [ICCV 2023] DETRs with Collaborative Hybrid Assignments Training 摘要 作者提出了一种新的协同混合任务训练方案&#xff0c;即Co-DETR&#xff0c;以从多种标…