LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

库是什么?库的分类、分类库、动态库

2022年11月29日 207点热度

一、库是什么? 简介:

假如,你有一个庞大的工程,代码量达到数百兆甚至是数G,你经常会遇到好多重复或常用的地方。每次使用到这些地方时如果都重新写一份基本相同的代码,这当然可以,不过这样会大大地降低工作效率,而且影响代码的可读性。更不好的是日后的修改工作会使你变得非常的繁琐,这样很不利于后期的维护。如果把这些相同的功能代码分别以模块的形式存放起来,把他们编译成库,使用时直接调用他们的库,这样直接使用起来非常的方便,更有利于代码的维护和升级。

库的概念:

库是由源代码编译出来的,是对一组源文件编译出来的中间文件(可以看我上一篇文章,在代码经过汇编过程后)。使用库可以做到不开放源代码,同时令其他单元可以调用到的效果,实现良好的接口封装。

其实,现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。比如我们常使用的printf函数,就是c标准库提供的函数。我们在使用时只需要包含相应的头文件就可以使用(非静态编译还要有相应的库文件)。而不用关心printf函数具体是如何实现的,这样就大大提高了程序员编写代码的效率。

二、库的分类

库大体上可以分为两类:静态库和动态库。在windows中静态库是以 .lib 为后缀的文件,共享库是以 .dll 为后缀的文件。在linux中静态库是以 .a 为后缀的文件,动态库是以 .so为后缀的文件。

创建动态库:

//func.c
int max(int a ,int b){
    return (a>b)?a:b;

linux创建文件_linux创建指定大小文件_linux创建netrc文件

}

生成链接库文件,会生成一个libfunc.so

gcc -fPIC -shared -o libfunc.so func.c

PIC:产生与位置无关代码,PIC(Position-Independent Code),代码中没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置linux vi 命令,都可以正确的执行

-shared:生成动态链接库

调用动态库linux是什么,编译,执行: 创建 test.c文件

 1. vim test.c 

2. Shift + i 3. 编写代码 4. Esc Shift + : 5. wq

编写代码

#include
 
void main(){

linux创建指定大小文件_linux创建文件_linux创建netrc文件

printf("%dn",max(23,5)); }

编译(包含链接库),生成可执行文件test.out

gcc test.c -o test.out -L. -lfunc

执行

./test.out

答案毫无疑问,报错!

在这里插入图片描述

解决报错

因为系统链接库列表中没有找到这个链接库,需要将这个链接库注册到系统

可以这么理解linux创建文件,因为编译生成执行文件的时候,只是使用了libfunc.so的定义,并没有把函数体整个包含进来,运行的时候用函数定义去动态查找完整的方法linux创建文件,那完整的方法怎么找?

1.使用系统默认链接库目录,这种方式需要把libfunc.so放入系统目录下:/lib,/usr/lib等

2.指明链接库目录目录,这种方式需要把libfunc.so目录注册到系统系统目录列表里,将libfunc.so所在目录写入文件etc/ld.so.conf,保存,执行:ldconfig,让系统添加库文件夹下的链接库文件

上面这时候再执行:./test.out,就能获得结果了

代码优化

linux创建文件_linux创建netrc文件_linux创建指定大小文件

上面代码虽然能正确执行了,但是有个问题,如果给你一个so文件,你能使用吗?

打开文件是乱码,里面有什么方法大家都不知道,所以我们要定义一个规范,能让使用者清晰的知道链接库中包含了哪些方法,所以需要建立一个头文件,说明func链接库里面包含哪些方法

//test.c
#include
#include"func.h"
 
void main(){
    printf("%dn",max(23,5));
}

这样就优化了代码的可读性

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 动态库
最后更新:2022年11月29日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
查看系统版本 linux “”的有关知识,不少人都会遇到这样的困境 Linux在内核中是如何记录进程资源的?你能从C语言源代码层面分析下吗? 【】原操作系统配备内核源代码,更不能进行内核模块实验 【Linux基础知识】与文件权限管理的Linux关系 linux/管理员管理员发布于5年前34(图) Linux和Unix操作系统之间有区别但也有联系?(一) Ubuntu系统如何升级和更新Linux内核版本?将推荐 Linux内核技术组成、组织和重要的数据结构等(组图) 【报错日志】一下升级linux内核的启动顺序为0 Linux终端窗口中输入mysql-V以显示MySQL版本信息sky 计算机操作系统全新版装系统盘点、理念与系统的优缺点 linux中常用的用户管理命令:1groups?列出当前用户所属 Linux下如何设置开机启动启动脚本?学算法 Linux中已经安装好了mysql命令 Linux系统用户系统上的三种类型的帐户的介绍 Linux下的开机启动设置方法是什么?脚本或服务 谷歌更新Linux内核构建的公共内核库:添加对kokoro作业的支持 linux下mysql中可以使用REVOKE语句来删除某个用户的权限 内核的角度来看,调用hotplug和通常的hotplug环境 Linux系统在开机的时候自动加载某些脚本或系统服务
Linux5.12的推送请求不断涌入新开放的合并窗口预计4月底看到它的稳定版本go语言被称作互联网时代的c语言,用来开发嵌入式linux的理由腾讯云服务器上也搭建一套环境,安装成功自动启动个人笔记本安装Ubuntu20.04LTS下载地址启动第一步--加载BIOS当你打开计算机电源(组图)虚拟机安装Ubuntu操作系统-Ubuntu空间20G镜像下载指令中各个make-C~/linuxM=`pwd编译Linux启动过程中的几个部分内核的引导(图)如何在Linux上安装虚拟机的结果大多都是怎么安装的一个免费软件时间跟进的小白鼠是什么鬼?专题计算机是如何启动的?、内核操作系统的启动流程学习Linux最简单、最实用的环境就是虚拟机环境(上)基于命令修改文件的权限命令-ld1.Linux磁盘分区和目录Linux发行版本之间的差别很少?国内性价比很高的Linux虚拟主机系统安装的流程是什么?Linux下修改文件权限的权限与所有权的实现就显得很有必要linux到底难不难学呢?推荐可以查看Linux命令大全Linux中修改文件权限的命令、创建者所在组、所有人Linux的内核放在了哪里?/boot的启动目录一览阿里云>社区>主题地图S>查看存储推荐
Linux计算机上使用ip命令来找到目标IP地址的方法 最常用、最受欢迎的Linux发行版来学习黑客和渗透测试 卸载软件yumclean清除yum缓存(更换过yum源的时候建议清除下之前缓存) 英伟达将LinuxGPU内核模块作为开放源码/MIT双重许可证(图) centos系统版本详细信息解决方案与操作系统版本兼容的重要性分析 【1024】后端技术学习路线思维导图,看这一篇就够了! 审计Linux系统日志可以提供有关网络事件的重要信息(图) 可编程器由器与可扩展器由器(ScalableRouter)的精确定义 Linux计算机的防火墙必需运行OpenSSH服务器软件 【每日一题】Linux内核源码/kernel/pid.c 【王者荣耀】Linux内核的构成与学习方法(一) 【好玩的网络-第2.5期】分配IP有哪些骚操作?小白保姆级教程 ubuntu如下系统的配置 树莓派2正式发布支持微软Windows10操作系统派 Ubuntu这款这款.10版本镜像文件下载地址获取地址! 物理内存大许多倍的内存管理子系统是怎么来的?(图) 三个电视盒子外接USBU盘,24小时专人维护! 为什么要给Linux二进制文件设置这种权限?(上) 统信UOS为啥火?国产操作系统又该如何发展?(组图) 虚拟网络编辑器网络配置教程,各个方法都不一样!
标签聚合
电脑 虚拟机 软件 linux服务器 shell linux系统 sudo 文件目录 unix 命令模式
书籍
课程
技术群
技术干货大合集↓
  • 2023年2月 / 26篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.