linux中的库的概念、动态库与静态库

news2024/11/13 21:23:41

1.为什么引用库

准备头文件、源文件和主程序文件

g++ 将源程序进行联合编译生成可执行出程序

./exec执行可执行程序

在上述案例中,主程序要是有的源程序代码,在add.cpp中,如果项目结束后,到了交付阶段,由于主程序的生成需要其他程序联合编译,那么就要将程序打包一起发给老板,这样该程序开发者自身的价值就不大了,该项目的知识产权就很容易被窃取。为了包含我们的知识产权,我们引入库的概念。

2.什么是库

库在linux中是一个二进制我呢见,它是由.cpp文件(不包含main函数)编译而来,其他程序如果想要使用该文件中的函数时,只需要编译生成可执行程序时,链接该源文件生成的库文件。库中存储的是二进制文件,不容易被窃取知识产权,做到了保护作用

库在linux系统中分为两类,分别是静态库和动态库

windows:

***.lib:静态库  ***.dll:动态库

linux:

***.a:静态库 ***.so:动态库

3.静态库以及制作

概念:将一个***.cpp的文件编译生成一个lib***.a的二进制文件,当你需要使用该文件中的函数时,只需要链接该库即可,后期可以直接调用

静态体现在:在使用g++编译生成程序时,将你的文件和库最终生成一个可执行文件(把静态库也放入到可执行程序中),每个可执行程序单独拥有一个静态库,体积较大,但是,执行效率高

3.1

准备程序

add.h

#ifndef _ADD_H
#define _ADD_H_

int add(int m,int n);//函数声明
#endif

add.cpp
int add(int m,int n)
{
return m+n;
}

main.cpp

#include<iostream>
#include<stdio.h>
#include "add.h"

using namespace std;

int main(int argc, const char *argv[])
{
    cout<<add(3,8)<<endl;     //调用外部文件中相关函数

    return 0;
}
3.2编译生成静态库

gcc -c ***.c -o ***.o //只编译不链接生成二进制文件

ar -crs lib***.a ***.o //编译生成静态库

如果有多个,o文件共同编译生成静态库:ar -crs lib***.a ***.o ***.o ...

ar用于生成静态库指令

c:用于创建静态库

r:将文件插入或者替换静态库中同名文件

s:重置静态库索引

3.3使用静态库

gcc main.cpp -L 库的路径  -l库名   -I头文件的名字

这个是份文件制造静态库

4.动态库及制作

概念:将一个***.cpp的文件编译生成一个lib***.so的二进制文件,当你需要使用该文件中的函数时,只需要链接该库即可,后期可以直接调用

动态体现在:在使用g++编译生成程序时,将你的文件和库中的相关函数索引表一起生成一个可执行文件,每个可执行程序只拥有函数的索引表,当程序执行到对应函数时,会根据索引表,动态寻找相关库所在位置进行调用,体积小,执行效率较低,但是可以多个程序共享一个动态库,所以,动态库也叫共享库。

4.1准备程序

add.h

#ifndef _ADD_H
#define _ADD_H_

int add(int m,int n);//函数声明
#endif

add.cpp
int add(int m,int n)
{
return m+n;
}

main.cpp

#include<iostream>
#include<stdio.h>
#include "add.h"

using namespace std;

int main(int argc, const char *argv[])
{
    cout<<add(3,8)<<endl;     //调用外部文件中相关函数

    return 0;
}

4.2编译生成动态库

g++ -fpIc -c ***.cpp -o **.o //编译生成二进制文件

g++ -shared ***.o -o lib***.so //依赖于二进制文件生成一个动态库

上诉两个指令可以合成一个指令

g++ -fPIC -shared ***.cpp -o lib***.so

4.4以上错误的解决方式

方式1:更改路径的宏

export LD_LIBRARY_PATH=库的路径

方法2:将自己的动态库放入系统的库函数中(/lib64  /isr/lib

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

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

相关文章

WPF篇(13)-ScrollViewer控件+ScrollBar滚动条+Slider滑动条

ScrollViewer控件 如果某个控件的尺寸太大&#xff0c;当前界面无法全部显示&#xff0c;则可以将这个控件包含在ScrollViewer中&#xff0c;因为ScrollViewer控件封装了一个水平滚动条ScrollBar和一个垂直滚动条ScrollBar&#xff0c;所以&#xff0c;ScrollViewer就是一个包…

基于llama.cpp实现Llama3模型的guff格式转换、4bit量化以及GPU推理加速(海光DCU)

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 序言 本文使用llama.cpp框架&#xff0c;对 Llama3-8B-Instruct 模型进行gguf格式转换&#xff0c;8bit量化&#xff0c;并在CPU和GPU上对8bit模型进行推理。 测试…

5.5.transformer

Transformer ​ Transformer是由编码器和解码器组成的&#xff0c;基于自注意力的模块叠加而成的&#xff0c;源(输入)序列和目标(输出)序列的嵌入(embedding)表示将加上位置编码在分别输入到编码器和解码器中&#xff1a; ​ ​ 从宏观角度来看&#xff0c;Transformer的编码…

Elastic 8.15:更好的语义搜索、新的 OTel 分布、SIEM 数据导入

作者&#xff1a;来自 Elastic Brian Bergholm 今天&#xff0c;我们很高兴地宣布 Elastic 8.15 正式发布。 有什么新功能&#xff1f; 8.15 版本包含大量新功能&#xff0c;包括更多工具来优化相关性、增强模型的灵活性和改进向量搜索&#xff0c;以及在 AI 驱动的安全分析方…

学习大数据DAY35 利用 echarts 的开源图表和 python 异常处理优化网站

目录 根据分数统计电影数量来生成图表 上机练习 14 添加异常 添加电影类型判断是整数及正整数异常 部署项目到 Nginx 上机练习 15 根据分数统计电影数量来生成图表 Echarts 官网&#xff1a; https://echarts.apache.org/examples/zh/index.html 下载柱状图和饼图 可以…

访问网站显示不安全如何处理

当访问网站时浏览器提示“不安全”&#xff0c;这通常是由于多种原因造成的。下面是一些常见的原因及其解决办法&#xff1a; 未启用HTTPS协议 如果网站仅使用HTTP协议&#xff0c;数据传输没有加密&#xff0c;会被浏览器标记为“不安全”。解决办法是启用HTTPS协议&#xff…

C++(4):基类-派生类

基类—>派生类 先构造基类再构造派生类 匿名对象形式向基类传参&#xff0c;基类先构造先传参 复制构造函数&#xff0c;采用类型兼容性规则即用派生类代替基类 使用protect派生类可访问其它地方不能访问 private只能自己访问 p访问的是自己类里的showTime 类型兼容性规则&…

HCIP | 实验二

概述 要求&#xff1a; 1.如图连接&#xff0c;合理规划IP地址&#xff0c;所有路由器各自创建一个loopback接口 2.R1再创建三个接口IP地址为201.1.1.1/24、201.1.2.1/24、201.1.3.1/24 R5再创建三个接口IP地址为202.1.1.1/24、202.1.2.1/24、202.1.3.1/24 R7再创建三个接口…

Mac平台M1PRO芯片MiniCPM-V-2.6网页部署跑通

Mac平台M1PRO芯片MiniCPM-V-2.6网页部署跑通 契机 ⚙ 2.6的小钢炮可以输入视频了&#xff0c;我必须拉到本地跑跑。主要解决2.6版本默认绑定flash_atten问题&#xff0c;pip install flash_attn也无法安装&#xff0c;因为强制依赖cuda。主要解决的就是这个问题&#xff0c;还…

批发行业进销存-入库单表格识别 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、进销存入库进货单单识别意义 对个人、商品、公示内容等纸质信息登记表进行识别&#xff0c;用于登记信息的结构化整理和统计&#xff0c;大幅度降低人力录入成本&#xff0c;提升信息管理的便捷性 1. 提高效率&#xff1a;自动转换节省了手动录入的时间和精力&#xff0c;…

实景视频可视化的结构化脚本,脚本分为三类:文字脚本,分镜头脚本和动态脚本

在视频创作的世界中&#xff0c;脚本是创作的基础和核心。无论是简短的广告视频&#xff0c;还是复杂的电影制作&#xff0c;脚本都扮演着不可或缺的角色。随着视频内容需求的多样化&#xff0c;结构化脚本逐渐成为确保创作效率和质量的重要工具。结构化脚本不仅帮助创作者清晰…

PythonStudio 控件使用常用方式(十八)TCategoryButtons

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;它使用的是Delphi的控件&#xff0c;常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点&#xff0c;也作为PythonStudio的参考。 从1.2.1版开始&#xff0c;Python…

Elastic Search 8.15:通过语义文本和重新排序实现可访问的语义搜索

作者&#xff1a;来自 Elastic Nick Chow, Sunayana Vatassery 在 8.15 中&#xff0c;我们的客户可以更轻松地获得出色的搜索结果。我们的最新版本带来了语义重新排名&#xff08;semantic reranking&#xff09;、额外的向量搜索工具和更多第三方模型提供商&#xff0c;并将我…

告别焦虑:使用 acme 实现 ssl 免费证书到期自动更新

文章目录 前言什么是 ACME 协议&#xff1f;ACME 使用指南安装下载使用 gitee 下载设置别名&#xff08;非必要&#xff09;注册账号更改证书生成方式生成证书重新生成证书并认证安装 SSL 证书 使用 SSL 证书验证 配置证书自动续期证书续期命令自动续期查看添加的定时任务 cron…

haproxy基础

目录 1 HAProxy介绍 1.1 版本对比 1.2 HAProxy功能 2 参数介绍与实践 2.1 global参数说明 2.2 真实代码格式实例 2.3 常用全局参数 2.3.1 nbproc -- 开启几个进程 2.3.2 cpu-map(CUP绑定) 2.3.3 nbthread 2 --开启2个线程 3 Proxies配置 3.1 Proxies配置-defaults 3.2 Proxi…

dolphinscheduler版本差异的配置造成的故障处理

dolphinscheduler1.3.4的common.properties的配置 [root@dbos-bigdata-test003 conf]# vim /opt/dolphinscheduler/conf/common.properties 下面的这个配置中8088直接在配置成端口即可 yarn.application.status.address=http://yarnIp1:8088/ws/v1/cluster/apps/%s dolphin…

守护历史文化瑰宝,RFID藏品管理系统助力文物保护

在中国悠久的历史长河中&#xff0c;有一座蕴藏着千年文化的古老建筑。这座建筑曾经是伟大文人杜甫的居所&#xff0c;承载着他卓越的文学成就和丰富的人生经历。然而&#xff0c;这样一座历史文化瑰宝的保护和管理一直面临着诸多挑战。 为了解决这一难题&#xff0c;我…

运维工具的衍化对运维工作的新挑战

运维工具的衍化对运维工作产生了深远的影响&#xff0c;这些影响体现在多个方面&#xff0c;包括提升运维效率、优化资源配置、增强故障应对能力、促进团队协作与沟通&#xff0c;以及面临新的挑战如数据安全和隐私保护等。运维工具的衍化对运维工作带来了多方面的新挑战&#…

用户体验至上:9款软件界面设计工具分享

你知道如何选择正确的UI设计软件吗&#xff1f;您知道哪些界面设计软件需要设计美观的用户界面&#xff0c;以及带来良好用户体验的APP吗&#xff1f;根据APP界面的不同功能&#xff0c;制作软件界面的选择也会有所不同。但是&#xff0c;并非要非常精通所有的制作软件界面&…

k8s集群管理 Pod管理命令

k8s集群管理命令 信息查询命令 子命令说明help用于查看命令及子命令的帮助信息cluster-info显示集群的相关配置信息api-resources查看当前服务器上所有的资源对象api-versions查看当前服务器上所有资源对象的版本config管理当前节点上的认证信息 资源对象概述 Pod概述 Pod 管…