Linux——静态库 共享库

1.库文件


1).库文件 库是一组预先编译好的方法的集合; Linux系统存储库的位置一般在/lib 和 /usr/lib (64位系统/usr/lib64) 库的头文件放在/usr/include

2).库的分类 静态库:libxxx.a(命名规则) 共享库:libxxx.so(命名规则)
3).准备文件:

//add.c
int add(int x,int y)
{
return x+y;
} 
//max.c
int max(int x,int y)
{
return x>y?x:y;
} 
//main.c
#include <stdio.h>
#include "foo.h"
int main()
{
int a=5,b=10;
printf("a+b=%d\n",add(a,b));
printf("max=%d\n",max(a,b));
return 0;
} 
//foo.h
int add(int x,int y);
int max(int x,int y);

2.静态库


(1).静态库的生成及使用

1)先将需要生成库文件的所有.c文件编译成.o文件;(目标文件)

2)创建静态库(使用ar命令) ar crv libxxx.a xxxx.o xxx.o c:创建库 r:将方法添加到库中 v:显示过程


(2)静态库的使用 gcc -o main main.c   -L. -lxxx -L:指定库的存储位置 -l:指定库的名称(不需要前面的lib和扩展名.a)
例如:gcc -o main main.c -L. -lfoo
(3).静态库的缺点: 当你同时运行许多应用程序并且它们都使用来自同一个函数库的函数时,内存中就会有同一函数的多个副本.而且在程序文件自身中也有多份同样的副本,这将消耗大量宝贵的内存和磁盘空间;

3.共享库


(1)将所有的.c文件编译成目标文件.o (2)将所有目标文件打包生成共享库: gcc -shared -fPIC -o libxxx.so xxx.o xxx.o (3)共享库的使用: gcc -o main main.c -L路径 -l库名

共享库执行的时候会出错,找不到对应的共享文件:比如libfoo.so;
注意:共享库必须要放到标准路径下: sudo mv libxxx.so /usr/lib 补充一个命令: 查看使用了那些共享库:ldd main

4.静态库与共享库的区别


共享库如果10个应用程序共享,那么磁盘上只有一份共享的库文件,而且运行加载时在内存中只加载了标记了的这一份库文件; 而静态库,就是这10个应用程序都包含了这个库文件,那么10份的库文件都放在磁盘上了(占用磁盘空间),而且运行加载的时候占用内存空间(10份库文件都要加载); 共享库便于升级. 

静态库的好处是在目标机器上运行程序的时候,就不再依赖于这个机器的空间,因为已经将方法都包含进来了;而共享库就是只有一份共享,比较节省空间,但是坏处就是运行的时候,这个主机上必须有这个库文件,没有程序就会运行失败;

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

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

相关文章

4.7Qt

自由发挥应用场景实现一个登录窗口界面。 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口相关设置this->setWindowTitle("原神启动");this->setWindowIcon(QIcon("C:\\Users\\17212\\Pict…

外包干了25天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

【Java】maven是什么?

先看一下基本概念: ①Maven 翻译为"专家"&#xff0c;"内行"是跨平台的项目管理工具。 主要服务于基于Java平台的项目构建&#xff0c;依赖管理和项目信息管理。 ②项目构建 项目构建过程包括【清理项目】→【编译项目】→【测试项目】→【生成测试报…

【JavaEE】Spring Web-MVC

目录 Spring Web MVC 是什么 什么是Serlet 什么是MVC 什么是Spring MVC 使用Spring MVC 建立连接 RequestMapping 请求 传递单个参数 传递多个参数 传递对象 后端参数重命名 传递数组 传递集合 传递JSON数据 获取url参数-pathvariable 上传文件RequestPart 获…

C++【组合模式】

简单介绍 组合模式是一种结构型设计模式&#xff0c; 只有在可以将对象拆分为【树状结构】的情况下使用。并且像使用独立对象一样使用它们。 常用于表示与图形打交道的用户界面组件或代码的层次结构。 基础理解 Q&#xff1a;为什么要用组合模式 &#xff1f; A&#xff1a;在…

SAP操作教程第14期:SAP B1如何进行自定义字段位置设置

服务对于企业而言永远是重中之重&#xff0c;想要提高服务呼叫效率&#xff0c;员工必须能够快速扫描单据和主数据中的重要信息&#xff0c;及时响应客户。那么&#xff0c;拥有适合企业业务流程的表单则是必不可少的前提。 所以&#xff0c;今天我们就来了解一下&#xff0c;在…

大模型应用解决方案:基于ChatGPT和GPT-4等Transformer架构的自然语言处理

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

Redis: 配置文件详解(Redis.conf)

文章目录 一、Units二、INCLUDES三、NETWORK四、GENERAL五、SECURITY六、LIMITS 一、Units 单位&#xff0c;配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit&#xff0c;大小写不敏感 二、INCLUDES 包含&#xff0c;多…

如何明确的选择IT方向?

一、明确目标 作为初学者&#xff0c;先树立自己目标&#xff0c;找到自己感兴趣的IT行业&#xff0c;IT行业分很多种&#xff0c;听的最多次的无非不就是web前端工、程序员、后端、大数据、网络运维等。学习知识也是为了找到更好的工作&#xff0c;所以我建议先去boss直聘、五…

海外网红营销的UGC策略:激发用户创意,提升品牌知名度

在当今数字时代&#xff0c;品牌营销已经从传统的广告宣传转变为了与用户互动和参与密切相关的形式。UGC作为一种强大的营销策略&#xff0c;正在成为品牌提升知名度和美誉度的关键手段之一。尤其是通过海外网红的传播&#xff0c;UGC的影响力更是得到了进一步放大。本文Nox聚星…

自定义gitlog格式

git log命令非常强大而好用&#xff0c;在复杂系统的版本管理中扮演着重要的角色&#xff0c;但默认的git log命令显示出的东西实在太丑&#xff0c;不好好打扮一下根本没法见人&#xff0c;打扮好了用alias命令拍个照片&#xff0c;就正式出道了&#xff01; 在使用git查看lo…

适用于 Windows 10 的 10 大免费数据恢复软件

数据丢失可能是一场噩梦&#xff0c;尤其是在涉及重要文件和文档时。无论是由于意外删除、系统崩溃还是病毒攻击&#xff0c;找到适合 Windows 10 的文件夹恢复软件都可以在恢复丢失的数据方面发挥重要作用。在本指南中&#xff0c;我们将探索适用于 Windows 10 用户的 10 大免…