当前位置: 首页 > news >正文

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何在 Windows 11/10/8/7 中恢复已删除和未保存的记事本文本文件
  • 爬虫解析代码结构
  • 培训第二十一天(mysql用户创建与授权、角色创建)
  • 【踩坑】TypeScript 中使用 sass 动态设置样式
  • 李宏毅老师机器学习常见英语词汇
  • 数值分析【3】
  • 数学建模--蒙特卡洛算法之电子管更换刀片寿命问题
  • 国产芯上运行TinyMaxi轻量级的神经网络推理库-米尔基于芯驰D9国产商显板
  • 【Qt】多种控件实现“hello world“
  • 从今天开始深入学习 SQL 优化
  • 搭建 Web 群集Haproxy
  • 安装pointnet踩坑记录(情绪篇)
  • 学习c语言第24天(练习)
  • 进程状态(二)----- linux 中具体的进程状态(上)
  • 设置临时环境变量
  • Android框架之Volley
  • eclipse(luna)创建web工程
  • HTTP那些事
  • HTTP--网络协议分层,http历史(二)
  • javascript 总结(常用工具类的封装)
  • Lucene解析 - 基本概念
  • Unix命令
  • Wamp集成环境 添加PHP的新版本
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 技术:超级实用的电脑小技巧
  • 老板让我十分钟上手nx-admin
  • 力扣(LeetCode)357
  • 排序算法学习笔记
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 删除表内多余的重复数据
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • -- 数据结构 顺序表 --Java
  • 我是如何设计 Upload 上传组件的
  • 正则表达式小结
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #每日一题合集#牛客JZ23-JZ33
  • #前后端分离# 头条发布系统
  • $$$$GB2312-80区位编码表$$$$
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (8)STL算法之替换
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (区间dp) (经典例题) 石子合并
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (实战篇)如何缓存数据
  • (推荐)叮当——中文语音对话机器人
  • (转)【Hibernate总结系列】使用举例
  • (转)EOS中账户、钱包和密钥的关系
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转载)PyTorch代码规范最佳实践和样式指南