c语言库文件

c语言库文件

  • 动态库
    • 动态库制作
      • 首先生成动态库文件名
      • 使用动态库编译
      • 动态库运行
      • 删除动态库
        • 1.sudo su
  • 静态库
    • 静态库制作
      • 需要将源文件.c转换成二进制文件.o(重定向文件)
      • 将重定向文件打包成静态库文件
      • 使用静态库文件
  • 静态库和动态库的区别
  • 复杂工程设定
    • 工程目录设定
      • 原始编译方式
      • 静态库编译
        • 生成重定向文件:我们将重定向文件生成到obj目录下
        • 生成静态库文件:我们将静态库存放到生成的lib目录
        • 使用静态库编译

库文件的概念

我们将已经实现的某些功能封装在一起,形成一个可以操作的函数库既可以方便我们函数调用,并且对代码进行了加密保护。
为了方便实现分装操作,我们将多个源文件(函数功能),打包成库,方便调用。
需要注意的是:库函数文件中只能包含功能性函数,不要将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.静态编译程序的时候,会将库中的代码直接编译到程序中,所以静态编译程序较大

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

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

复杂工程设定

工程目录设定

实际开发中,我们会将不同的文件类型存放在不同的目录当中进行存储,此实程序会将数据内容分为不同的文件夹来保存资源

  • bin 可执行程序文件
  • inc头文件集合 .h
  • lib 存放库文件(.so文件和.a文件) 静态库 动态库
  • obj 存放重定向文件(.o文件)
  • src 存放源文件(.c文件)
  • main.c 入口文件

在这里插入图片描述

原始编译方式

gcc sawp.c add.c main.c -o main
gcc 带路径的源文件列表 -o 带路径的可执行文件 -I 头文件路径 -L 库文件路径 -l库名
gcc ./src/*.c main.c -o ./bin/main -I ./inc/

编译成功运行可执行文件就行

静态库编译

生成重定向文件:我们将重定向文件生成到obj目录下

gcc add.c -o add.o -c
gcc 带路径的源文件.c -o 带路径的重定向文件.o -I 头文件路径
gcc ./src/add.c -o ./obj/add.o -c -I ./inc/

生成静态库文件:我们将静态库存放到生成的lib目录
ar cr libfunc2.a add.o swap.o
ar cr libfunc2.a *.o
ar cr 带路径的静态库文件.a 带路径的重定向文件.o
ar cr ./lib/libfunc2.a ./obj/*.o
使用静态库编译
gcc main.c -o main -lfunc -I ./ -L ./
gcc main.c -o 带路径的可执行程序文件 -l静态库名 -I 头文件路径 -L 库文件路径
gcc main.c -o ./bin/main -lfunc2 -I ./inc/ -L ./lib/

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

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

相关文章

MySQL【知识改变命运】07

MySQL 1&#xff1a;Group by 分组查询1.1&#xff1a;语法&#xff1a;1.2&#xff1a;练习 2&#xff1a;having⼦句3回顾&#xff1a;3&#xff1a;内置函数3.1 :⽇期函数 1&#xff1a;Group by 分组查询 可以根据某列&#xff0c;进行分组查询&#xff0c;比如学校里面的…

NAT:网络地址转换

基本知识 1.公有IP和私有IP 公有IP:全球唯一&#xff0c;可以在互联网中通信&#xff0c;付费使用 私有IP&#xff1a;本地唯一&#xff0c;不可以在互联网中使用&#xff0c;无需付费 私网地址范围 A类: 10.0.0.0-------10.255.255.255 B类&#xff1a;172.16.0.0------1…

汽车免拆诊断案例 | 2023款零跑C01纯电车后备厢盖无法电动打开和关闭

故障现象  一辆2023款零跑C01纯电车&#xff0c;累计行驶里程约为2万km&#xff0c;车主进厂反映&#xff0c;后备厢盖无法电动打开和关闭。 故障诊断  接车后试车&#xff0c;操作后备厢盖外侧、驾驶人侧及遥控钥匙上的后备厢盖开启按钮&#xff0c;可以听到后备厢盖解锁的…

springboot项目中开启mybatis的sql日志

在 application.yml 文件中 添加 mybatis-plus 配置&#xff0c;再重启项目&#xff0c;这里用到了mybatis-plus的自带sql日志打印 # application-jdbc.yml mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl如果只是用的mybatis的话&#x…

React(五) 受控组件和非受控组件; 获取表单元素的值。高阶组件(重点),Portals; Fragment组件;严格模式StrictMode

文章目录 一、受控组件1. 什么是受控组件2. 收集input框内容3. 收集checkBox的值4. 下拉框select总结 二、非受控组件三、高阶组件1. 高阶组件的概念 (回顾高阶函数)2. 高阶组件应用&#xff1a;注入props(1) 高阶组件给---函数式组件注入props(2) 高阶组件给---类组件注入prop…

Qt-链接数据库可视化操作

1. 概述 Qt 能够支持对常见数据库的操作&#xff0c;例如&#xff1a; MySQL、Oracle、SqlServer 等等。 Qt SQL模块中的API分为三层&#xff1a;驱动层、SQL接口层、用户接口层。 驱动层为数据库和SQL接口层之间提供了底层的桥梁。 SQL接口层提供了对数据库的访问&#xff0…

Excel多级结构转成树结构形式

第一步&#xff1a;Excel文件的形式如下 第二步&#xff1a;转换成树结构可选形式 第三步&#xff1a;具体怎么实现&#xff1f; &#xff08;1&#xff09;、需要借助数据库中表来存储这些字段&#xff0c;一张表&#xff08;aa&#xff09;存Excel文件中的所有数据&#xff…

基于百度智能体开发爱情三十六计

基于百度智能体开发爱情三十六计 文章目录 基于百度智能体开发爱情三十六计1. 爱情三十六计智能体2. 三十六计开发创意3. 智能体开发实践3.1 基础配置3.2 进阶配置3.3 调优心得3.4可能会遇到的问题 4. 为什么选择文心智能体平台 1. 爱情三十六计智能体 爱情三十六计 是一款基于…

《计算机视觉》—— 基于PyCharm中的dlib库实现人脸关键点定位

文章目录 1. 安装必要的库2. 下载dlib的人脸检测器和关键点预测器模型3. 编写代码 人脸关键点定位是指通过计算机视觉技术&#xff0c;识别和定位人脸图像中的关键点&#xff0c;如眼睛、鼻子、嘴巴等特定位置。这些关键点的准确定位对于人脸识别、表情分析、姿态估计等应用具有…

分库分表方式介绍

分库分表方式 分库分表包括分库和分表两个部分&#xff0c;在生产中通常包括&#xff1a;垂直分库、水平分库、垂直分表、水平分表四种方式&#xff1b; 1、垂直分表 1.1 垂直分表定义 垂直分表就是在同一数据库内将一张表按照指定字段分成若干表&#xff0c;每张表仅存储其…

Unity中实现预制体自动巡逻与攻击敌人的完整实现指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

wireshark 解密浏览器https数据包

一、导出浏览器证书有两种方法 1、在浏览器快捷方式追加启动参数&#xff1a; --ssl-key-log-file"d:\log\2.log" C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe --ssl-key-log-file"d:\log\2.log" 2、环境变量中新建用…

整理—计算机网络

目录 网络OSI模型和TCP/IP模型 应用层有哪些协议 HTTP报文有哪些部分 HTTP常用的状态码 Http 502和 504 的区别 HTTP层请求的类型有哪些&#xff1f; GET和POST的使用场景&#xff0c;有哪些区别&#xff1f; HTTP的长连接 HTTP默认的端口是什么&#xff1f; HTTP1.1怎…

win10卸载软件后发现“应用和功能”中还残留着软件卸载项怎么办?

win10卸载软件后发现“应用和功能”中还残留着软件卸载项怎么办&#xff1f; 1、方法一&#xff1a;2、方法二&#xff1a;3、在 Windows 中卸载或删除应用和程序 1、方法一&#xff1a; 点击控制面板界面中的程序下方的删除程序。 2、方法二&#xff1a; 1.winR打开运行窗…

JAVA——IO流

目录 1.概述 字节流&#xff1a; 2.分类 3.输入文件数据 1.创建对象 2.写出数据 3.释放资源 4.读出文件数据 1.创建对象 2.读取数据 3.释放资源 5.字符集 a.ASCII b.GBK c.Unicode 6.乱码 7.编码、解码常见方法 a.编码方法 1.默认方式编码 2.指定方式编码 …

4.7 大数据应用场景

文章目录 今天&#xff0c;我非常荣幸能与大家分享一个充满潜力和变革的主题——大数据的应用场景。在这个信息爆炸的时代&#xff0c;大数据已经成为推动各行各业发展的重要驱动力。接下来&#xff0c;我将带领大家探索大数据在不同行业中的神奇应用。 首先&#xff0c;让我们…

Wed前端入门——HTML、CSS

Wed前端入门——HTML、CSS 一般的页面有HTML、CSS以及JavaScript组成 HTML定义了页面的结构和内容&#xff0c;包括文本、图像、链接等等CSS用于定义页面的布局和样式JS用于添加交互性和动态功能作用 一、HTML 基本格式&#xff1a; <!-- 文档类型为HTML --> <!D…

大语言模型实战教程首发:基于深度学习的大规模自然语言处理模型LLM详解 -Shelly

我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 大模型的热度&#xff0c;实在是很高&#xff0c;诺奖也颁给了…

读书笔记《有效需求分析》业务场景梳理

1. 关键思考链 2. 执行流程 3. 执行细则 1&#xff09;最重要的是从业务流程到业务场景的梳理。 2&#xff09;主、变、支、管流程&#xff08;待解读&#xff09; 3&#xff09;排序业务场景&#xff08;待分析&#xff09; 4&#xff09;各分支判断是独立的且需要系统支持&a…

Vite创建Vue3项目以及Vue3相关基础知识

1.创建Vue3项目 1.运行创建项目命令 # 使用 npm npm create vitelatest2、填写项目名称 3、选择前端框架 4、选择语法类型 5、按提示运行代码 不出意外的话&#xff0c;运行之后应该会出现 下边这个页面 6.延伸学习&#xff1a;对比webpack和vite&#xff08;这个是面试必考…