c语言库文件

c语言库文件

  • 动态库
    • 动态库制作
      • 首先生成动态库文件名
      • 使用动态库编译
      • 动态库运行
      • 删除动态库
        • 1.sudo su
  • 静态库
    • 静态库制作
      • 需要将源文件.c转换成二进制文件.o(重定向文件)
      • 将重定向文件打包成静态库文件
      • 使用静态库文件
  • 静态库和动态库的区别

库文件的概念

我们将已经实现的某些功能封装在一起,形成一个可以操作的函数库既可以方便我们函数调用,并且对代码进行了加密保护。
为了方便实现分装操作,我们将多个源文件(函数功能),打包成库,方便调用。
需要注意的是:库函数文件中只能包含功能性函数,不要将main函数封装进去

在这里插入图片描述

动态库

  • 1.库中的代码不会通过编译进入到程序里面,那么形成的可执行程序文件比较小
  • 2.由动态库编译的程序,需要运行这个程序的系统环境变量中存在这个库文件

动态库制作

1.所有的动态库后缀都是.so,前缀需要是lib,动态库的名字为:libxxx.so
2.直接将源文件生成为动态库文件

add.c

int add(int a, int b)
{return a + b;
}

add.h

#ifndef __ADD_H__
#define __ADD_H__
#include <stdio.h>
int add(int a, int b);
#endif

max.c

int max(int a, int b)
{return a > b ? a : b;
}

max.h

#ifndef __MAX_H__
#define __MAX_H__
#include <stdio.h>
int max(int a, int b);
#endif

main.c

#include <stdio.h>
#include "add.h"
#include "max.h"
int main()
{printf("add=%d\n", add(10, 20));printf("max=%d", max(100, 10));return 0;
}

首先生成动态库文件名

gcc -shared -fPIC -o 动态库文件名 源文件1 源文件2 源文件3...

表示将所有的源文件都编译成指定名字的动态库文件(.so文件)
选项:
-shared表示生成的库文件为.so动态库
-fPIC表示代码和地址无关,不需要被同模块重定位,生成可操作的PIC代码
比如:
将封装了加法功能函数的源文件aad.c 以及求最大值的函数源文件max.c
封装成库文件
gcc -shared -fPIC -o libfunc.so add.c max.c 动态库文件名 libxxx.so ,-o选项不要漏 ,不带main主函数

在这里插入图片描述

使用动态库编译

gcc 主函数.c -o 可执行文件名 -l库文件名 -I 头文件路径 -L 库文件路径
比如:
由于上面生成了一个名为funlibfun.so库文件
所以下面执行命令的为lfun
gcc main.c -o main -lfun -I ./ -L ./
说明:./表示在当前目录下查找文件
在这里插入图片描述

注意这个时候虽然动态库里面生成了,但是系统库里面依然没有 直接运行**./main**的话还是会报错

在这里插入图片描述

动态库运行

上面提到会报错
解决办法:将动态库文件拷贝到系统库位置

sudo cp libadd.so /lib

这个时候输入ls /lib发现找到了libfun这个库文件在这里插入图片描述

我们刚才命名的可执行文件为main因此这里直接执行./main就可以执行了

在这里插入图片描述

使用动态库的好处:

  • 1.隐藏了函数实现的代码,只暴露接口,提高代码的安全性
  • 2.可以直接使用库中的函数,而不需要重新实现函数
    比如:现在如果需要使用add函数,只需要新建一个源文件,做一下add函数的声明,就可以直接使用add函数。

在这里插入图片描述

在以上代码中我们发现只声明了 并没有定义但是他还是引用了我们之前定义的库函数
gcc -o main 9.c -L./book -lfun

  • main是最终生成的可执行的二进制文件
  • 9.c 是源文件
  • -L 后面接的是表示当前目录是库文件的搜索路径,这样编译器可以在当前目录中查找共享库 libfun.so,因为我的libfun.so是在book下面的所以./book
  • -l 后面接-lfun 表示链接 libfun.so

删除动态库

如果需要删除动态库文件,就需要删除/lib目录下的动态库.so文件,但是lib目录只能由管理员操作,所以要删除,需要先获得管理员权限。

sudo su
rm -rf 删除的文件名
1.sudo su

会先验证用户密码
查看lib下面的动态库ls /lib
在这里插入图片描述
cd /lib
进入lib文件
rm -rf libadd.so libfun.so 删除要删除的库文件
exit退出
在这里插入图片描述

在这里插入图片描述
删除过后再次执行文件报错,证明动态文件库已经被删

静态库

静态库特点

格式文件:libxxx.a 比如:libadd.a

  • 1.静态库里面的代码会进入到程序中,静态编译的程序比较大
  • 2.有静态库编译的程序,必须要在运行环境中存在这个库文件,才可以允许。

文件自己定义
文件可以接着用以上的文件

静态库制作

需要将源文件.c转换成二进制文件.o(重定向文件)

gcc 源文件.c -o 重定向文件.o -c
比如:gcc swap.c -o swap.o -cgcc -c  add.c -o add.o 

注意文件重定向需要一个个去执行

将重定向文件打包成静态库文件

ar cr libfunc11.a swap.o add.o

使用静态库文件

gcc 主函数.c -o 可执行文件 -l库文件 -I 头文件路径 -L 库文件路径
gcc main.c -o main -lfunc11 -I ./ -L ./

在这里插入图片描述
使用静态库的时候把生成的静态库文件复制一下就可以了
在这里插入图片描述

静态库和动态库的区别

1.动态库和静态库创建方式不同
2.动态编译程序的时候,不会将库中的代码加入到程序中,所以动态编译程序较小
3.静态编译程序的时候,会将库中的代码直接编译到程序中,所以静态编译程序较大

静态库的特点:
优点:可执行文件依赖较少,编译期间完成链接,装载快
缺点:可执行文件较大,可作为其他库的依赖,会造成多余的副本,升级不方便,必须重新编译

动态库的特点:
优点:动态库可以实现进程之间的资源共享,即存在一份就行,升级简单,不需要重新编译
缺点:运行期间必须加载代码,会减慢代码执行速度,程序需要的依赖较多,必须存在于系统库中

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

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

相关文章

python-读写Excel:openpyxl-(1)基础操作之读写数据

目录 工作薄 创建/打开工作薄对象 获得默认sheet 工作表 创建工作表 删除工作表 获取表名 复制表 获取表对象 单元格 列号数字与字母转换 获取有效数据行和列 单元格对象获取 获取有效数据区域 获取指定行对象 value获取单元格数据值 修改及写入数据 插入或删…

C#里使用DataGridView来显示500万行数据

如果有500万行数据需要显示,大家肯定感觉很麻烦。 因为一次性地往列表里添加500万行数据,就需要很久的时间, 并且当滚动的时候就会更新比较慢。 有没有更好的方式呢? 其实可以采用虚拟列表的方式,也就是设置下面的方式: dataGridView1.VirtualMode = true; 这样列表…

老人桌面 1.3.5|专为老人设计的便捷实用桌面应用

老人桌面是一款专为老人设计的便捷实用桌面应用&#xff0c;具有超大字体设计&#xff0c;符合老人视力水平&#xff0c;撞色简洁的应用界面&#xff0c;拯救老人视觉体验。此外&#xff0c;还提供了常用的实用小工具&#xff0c;让老人能够轻松使用手机。 大小&#xff1a;5.…

vuefor循环动态展示图片不显示

问题代码如下 <div class"zjjc_list_bottom" v-for"(item, index) in zjjcList" :key"item.id"><img :src"./assets/left_blue_ (index 1) .png" alt""> </div> 理论来说是不会有问题&#xff0c;但…

An.如何在an中截取音频片段

如何在an中截取音频片段 在an动画制作过程中&#xff0c;部分片段需要插入音乐&#xff0c;如果想要插入一首歌曲的其中一小节&#xff0c;打开音频编辑软件操作就很麻烦&#xff0c;不妨直接在an中操作&#xff1a; 以这首节气歌为例&#xff0c;前奏太长需要剪掉前面的部分 …

图片/视频预览页面开发

使用到了vant-ui中的轮播组件、图片组件 数据结构示例&#xff1a; // type: 1图片 2视频 list: [{type: 1,url: adfdsfadsfasdf.png,},{type: 2,url: asdfasdfasdf.mp4,} ],item: {type: 1,url: adfdsfadsfasdf.png, },// utils/index.js/*** 图片/视频预览* param list* …

Spring Boot 整合 RocketMQ 之普通消息

前言&#xff1a; 在消息中间件领域中 RocketMQ 是一种非常常见的消息中间件了&#xff0c;并且是由阿⾥巴巴开源的消息中间件 &#xff0c;本篇简单分享一下 Spring Boot 项目集成 RocketMQ 的过程。 RocketMQ 系列文章传送门 RocketMQ 的介绍及核心概念讲解 Spring Boot …

WPF -- LiveCharts的使用和源码

LiveCharts 是一个开源的 .NET 图表库&#xff0c;特别适用于 WPF、WinForms 和其他 .NET 平台。它提供了丰富的图表类型和功能&#xff0c;使开发者能够轻松地在应用程序中创建动态和交互式图表。下面我将使用WPF平台创建一个测试实例。 一、LiveCharts的安装和使用 1.安装N…

VUE-鼠标移入到目标区域变成小手形状

工作中有个场景&#xff1a;当鼠标移动到某个区域时显示为“小手”状 其实这个东西特别简单&#xff0c;只是用的不多平常。 我们只需要给目标区域的style样式中加入【cursor: pointer;】这个鼠标就好了。 <span class"el-dropdown-link">下载 </span>…

软件测试与软件缺陷的基础知识

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

计算机视觉之可做什么

1、计算机视觉的应用 计算机视觉在我们生活中已经有了很广泛的应用&#xff0c;在我们可见、不可见&#xff1b;可感知、不可感知的地方&#xff0c;深深地影响了我们的生活、生产方式。 日常生活&#xff1a;美颜相机、火车站刷脸进站、线上办理业务的身份认证、自动驾驶等等…

供应链PC实操落地实践|得物技术

目录 一、背景 二、实操模式 三、快捷码设计和使用 1. 快捷码布局 2. 快捷码的准确识别 3. 快捷码的高亮反馈 4. 快捷码打印和黏贴建议 四、问题复盘 1. 基准体验的梳理 五、实操环境检测 1. 实操环境的安装和配置 2. 实操环境检测能力的使用流程 3. 实操检测能力的技术架构 4.…

Vue 3 数组变更详解:哪些操作会修改原数组?| 笔记

Vue 3 使用 Proxy 来侦测响应式对象的变化&#xff0c;数组作为常用数据类型&#xff0c;自然也被 Vue 3 自动侦测和管理。在处理数组时&#xff0c;了解哪些操作会修改原数组&#xff0c;哪些操作不会修改原数组&#xff0c;对高效编写 Vue 应用程序至关重要。 本文将详细介绍…

LeetCode 面试经典150题 Z字形变换

题目&#xff1a; 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你…

windows recvfrom错误10014

使用windows socket的udp客户端与linux udp服务端通讯&#xff0c;windows发送数据正常&#xff0c;接收偶尔不正常&#xff0c;但是通过抓包发现服务端是发送了数据给客户端的&#xff0c;网上找了很急都没解决&#xff0c;最后发现是windows与linux下 recvfrom 最后一个参数有…

CSS——文字打字机效果

CSS——文字打字机效果 本文通过纯 CSS 实现文字的打字机效果&#xff0c;然后借助 JS 实现了扩展。 typewriter 基本思路 使用伪元素覆盖原文字&#xff0c;并且使用伪元素模拟闪烁的光标效果。 具体流程 首先是一些基本的设置 <!DOCTYPE html> <html lang"…

什么是Qseven?模块电脑(核心板)规范标准简介二

1.概念 Qseven是一种通用的、小尺寸计算机模块标准&#xff0c;适用于需要低功耗、低成本和高性能的应用。 Qseven模块电脑&#xff08;核心板&#xff09;采用230Pin金手指连接器 2.Qseven的起源 Qseven最初是由Congatec、SECO、MSC三家欧洲公司于2008年发起&#xff0c;旨在…

Python中的SQLAlchemy:解锁数据库操作的新世界

引言 SQLAlchemy是一个Python SQL工具包和ORM&#xff0c;它提供了全面的企业级持久性模式。通过SQLAlchemy&#xff0c;你可以使用Python类来定义数据库表&#xff0c;并使用面向对象的方式来进行数据库操作&#xff0c;如查询、更新等。这种ORM方法不仅使代码更加简洁易读&a…

基因科技领军企业——桐树基因完成D轮融资,创新科技引领生命科学

2024年10月8日&#xff0c;无锡桐树生物科技有限公司&#xff08;以下简称桐树基因&#xff09;正式完成过亿元人民币D轮融资。本轮融资由无锡市梁溪科创产业投资基金&#xff08;博华资本管理&#xff09;领投&#xff0c;江苏建道创业投资有限公司跟投&#xff0c;总额过亿元…

简单谈谈Spring 中Aware是什么

在spring中&#xff0c;aware是spring提供的一种扩展机制 在一般情况中&#xff0c;是不需要感知容器的存在的&#xff0c;spring 会帮我们自动装配完成。 但是在一些特定的场景下&#xff0c;比如我需要获取spring容器中的某个对象&#xff0c;那么就需要获取到 spring 上下文…