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

相关推荐
我爱学习好爱好爱3 分钟前
Prometheus监控栈 监控Linux操作系统
linux·grafana·prometheus
sleetdream6 分钟前
联想开天统信UOS安装镜像 增加系统分区空间
linux
ArrebolJiuZhou13 分钟前
arm指令集(一)
linux·运维·arm开发
一只旭宝15 分钟前
Linux专题三:目录结构即相关操作指令,gdb调试,进程基础,以及makefile工具
linux
Azure DevOps29 分钟前
Azure DevOps Server 正式版本发布
运维·microsoft·azure·devops
lbb 小魔仙30 分钟前
Steam Deck OLED 拆解与评测:Valve 对 Linux 掌机的又一次精进
linux·运维·服务器
一枚正在学习的小白35 分钟前
prometheus监控redis
linux·运维·服务器·redis·prometheus
白帽子凯哥哥36 分钟前
Misc题目中图片隐写和流量分析的详细工具使用技巧
linux·运维·web安全·网络安全·docker·渗透测试
lzjava202437 分钟前
Python中的模块和包
linux·开发语言·python
DX_水位流量监测38 分钟前
城市易涝点水位雨量监测设备技术体系与实践应用
大数据·运维·服务器·网络·人工智能