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,一经查实,立即删除!

相关文章

老人桌面 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;前奏太长需要剪掉前面的部分 …

WPF -- LiveCharts的使用和源码

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

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

✨✨ 欢迎大家来访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.…

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;你…

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

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

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

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

【数据结构】二叉树(一)遍历

导言 前面以及有了堆的基础&#xff0c;现在来学习二叉树。二叉树的学习和前面的数据结构很不一样&#xff0c;前面我们主要学习用数据结构储存数据&#xff0c;以及实际手搓数据结构的增删查改&#xff1b;而学习二叉树主要是为我们以后学搜索二叉树以及后面的AVL树等数据结构…

2024.10.10计算机外部设备及调试培训

授课老师&#xff1a;杨戬 1.计算机组成 cpu&#xff0c;主板&#xff0c;内存&#xff0c;硬盘&#xff0c;电源&#xff0c;显示器&#xff0c;键盘和鼠标&#xff0c;光驱和显卡&#xff0c;其他外部设备。 2.虚拟机专业版转换 由于我们在2024.10.8的培训中已经安装了wi…

GPT4o,GPTo1-preview, 拼

兄弟们GPT刚开的 需要上车的扣&#xff0c;工作用 大家一起PIN分摊点压力。 在当今数字化的时代&#xff0c;程序员这一职业已经从幕后走到了前台&#xff0c;成为推动科技进步和社会变革的关键力量。编写代码、解决问题、不断学习新技术&#xff0c;程序员们的日常充满了挑战与…

【物流配送中心选址问题】基于退火算法混合粒子群算法

课题名称&#xff1a; 基于退火算法混合粒子群算法的物流配送中心选址问题 改进方向&#xff1a;模拟退火算法优化粒子群算法 代码获取方式&#xff08;付费&#xff09;&#xff1a; 模型说明&#xff1a; 待补充 Matlab仿真结果&#xff1a; 1. 模型优化后的仿真结果 2…

vscode中安装python的包

首先需要调出命令行。然后运行代码&#xff0c;找到你所需要的环境。 PS C:\Users\Administrator\AppData\Local\ESRI\conda\envs\arcgispro-env> conda env list # conda environments: #C:\ProgramData\Anaconda3 base * C:\Users\Administrator\.con…

搭子小程序:全新在线找搭子,满足社交

搭子作为一种新的社交方式&#xff0c;为大众带来的各种陪伴型的社交模式&#xff0c;不管是饭搭子、健身、遛狗、学习等&#xff0c;都可以找到适合自己的搭子。搭子主打各个领域的陪伴&#xff0c;双方都能够在社交相处中保持着边界感&#xff0c;不涉及情感纠葛等&#xff0…

vue 入门二

参考&#xff1a;丁丁的哔哩哔哩 11.组件基础 传递 props 父组件 <BlogPost title"My journey with Vue" />子组件 <script setup> defineProps([title]) </script><template><h4>{{ title }}</h4> </template>props第…

【论文翻译】HTVGNN:一种用于交通流量预测的混合时间变化图神经网络

题目A Novel Hybrid Time-Varying Graph Neural Network For Traffic Flow Forecasting论文链接https://arxiv.org/pdf/2401.10155v4关键词交通流预测&#xff0c;图神经网络&#xff0c;Transformer&#xff0c;多头自注意力 摘要 实时且精确的交通流量预测对于智能交通系统的…

bpmn-js 元素与布局渲染

BPMN-JS 是基于 BPMN 2.0来定义元素关联关系,并通过Diagram-js库来实现web可视化的显示和编辑工作。Diagram-js 也是由BPMN.IO组织开发的一个专门用于业务流程建模符号(BPMN)的可视化开源 JavaScript 库。 元素(Elements) BPMN 2.0(Business Process Model and Notation…

大数据-158 Apache Kylin 安装配置详解 集群模式启动

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…