基础IO -- 动静态库(1)

server/2025/1/18 17:58:20/

目录

一、认识库

​编辑

二、静态库

1)粗略认识

2)理解


一、认识库

C语言标准库:

C++标准库:

下面才是C++的标准库,上面的只是配置过Vim后显示出来的

在Linux中,一般动态库以 .so结尾、静态库以 .a结尾

而在Windows中,一般动态库以 .dll结尾、静态库以 .lib结尾

Linux中大部分指令都是用C语言编写的:

二、静态库

1)粗略认识

所谓的库文件,本质就是把 .o 文件打包

ar -rc libmyc.a *.o

即用ar -rc指令用来将所有的.o文件打包成.a类似静态库文件

这样就可以直接使用mymath.c和mystdio.c中的实现,来成功编译代码了

mymath.h:

#pragma once    int Add(int a, int b);                                                                             
int Sub(int a, int b); 

mystdio.h:

  1 #pragma once                                                                                                         2                                                                                                          3 #include <string.h>                                                                                                         4 #include <stdlib.h>                                                                                                         5 #include <sys/types.h>                                                                                                         6 #include <sys/stat.h>                                                                                                         7 #include <fcntl.h>                                                                                                         8 #include <unistd.h>                                                                                                         9                                                                                                          10 #define LINE_SIZE 1024                                                                                                         11 #define FLUSH_NOW  1                                                                                                         12 #define FLUSH_LINE 2                                                                                                         13 #define FLUSH_FULL 4                                                                                                         14                                                                                                          15 struct _myFILE                                                                                                                                                                                               16 {                                                                                                         17     unsigned int flags;                                                                                                         18     int fileno;                                                                                                         19     // 缓冲区                                                                                                         20     char cache[LINE_SIZE];                                                                                                         21     int cap;                                                                                                         22     int pos; // 下次写入的位置                                                                                                         23 };                                                                                                         24                                                                                                          25 typedef struct  _myFILE myFILE;                                                                                                         26                                                                                                          27 myFILE* my_fopen(const char *path, const char *flag);                                                                                                         28 void my_fflush(myFILE *fp);                                                                                                         29 ssize_t my_fwrite(myFILE *fp, const char *data, int len);                                                                                                         30 void my_fclose(myFILE *fp);     

main.c:

#include "mymath.h"
#include "mystdio.h"
#include <stdio.h>int main()
{int a = 10;int b = 20;printf("%d + %d = %d\n", a, b, Add(a, b));const char* message = "this is test text!\n";myFILE* fp = my_fopen("./log.txt", "w");my_fwrite(fp, message, strlen(message));my_fclose(fp);return 0;
}

为什么要使用库呢?? --原因就是为了提高开发效率

2)理解

提供库给用户

1.提供头文件   ---   告诉你怎么用

2.提供一个库文件(.o文件打包)   ---  告诉你怎么实现

将这个mylib目录打包压缩给别人,别人就可以去使用我们写的这一个库

但是不能直接使用,而是需要安装到系统里才能使用

--即将头文件和库文件拷贝到系统的头文件和库文件搜索路径里面

sudo cp mylib/include/*.h /usr/include/

sudo cp mylib/lib/*.a /lib64

-但是一般非官方的库特别不建议直接拷贝到搜索路径

但是你会发现,当你拷贝到搜索路径后,并且将包含头文件的双引号("")改为了<>,gcc编译时还是会有报错提示

这是因为,C/C++的库,gcc/g++默认是认识C/C++库,libmyc.a --> 别人写的(第三方提供) -->  gcc/g++ 不认识 -->  -l

gcc main.c -llibmyc.a // 该代码是不行的// 因为库libmyc.a的真正名字是去掉 lib 和 .a
gcc main.c -lmyc // 可以成功编译
gcc main.c -l myc // 也可以

静态库的gcc选项:

gcc main.c -I ./mylib/include/ -L ./mylib/lib/ -lmyc

为什么不需要指定头文件名称呢??

--- 其实在含main函数的源文件里面就已经指定了  即#include ......

那我们可不可以自己指定头文件的路径及名称??

这是为什么呢??

只有当我们用双引号("")包含头文件时,系统才会考虑到当前工作路径去寻找头文件

我们的编译不是使用了我们的stdio和math库吗,为什么可执行文件中不包含?

若是gcc时,没有 -static 修饰,则是优先动态链接,没有的话会默认将静态库局部性的拷贝到可执行文件里面

有 -static 修饰,则会强制静态链接


http://www.ppmy.cn/server/159413.html

相关文章

ZooKeeper 核心知识全解析:架构、角色、节点与应用

1.ZooKeeper 分布式锁怎么实现的 ZooKeeper 是一个高效的分布式协调服务&#xff0c;它提供了简单的原语集来构建更复杂的同步原语和协调数据结构。利用 ZooKeeper 实现分布式锁主要依赖于它的顺序节点&#xff08;Sequential Node&#xff09;特性以及临时节点&#xff08;Ep…

【SpringBoot】【log】 自定义logback日志配置

前言&#xff1a;默认情况下&#xff0c;SpringBoot内部使用logback作为系统日志实现的框架&#xff0c;将日志输出到控制台&#xff0c;不会写到日志文件。如果在application.properties或application.yml配置&#xff0c;这样只能配置简单的场景&#xff0c;保存路径、日志格…

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库 基本信息数据库配置设置密码控制台开…

分频器code

理论学习 数字电路中时钟占有非常重要的地位。时间的计算都依靠时钟信号作为基本单元。一般而言&#xff0c;一块板子只有一个晶振&#xff0c;即只有一种频率的时钟&#xff0c;但是数字系统中&#xff0c;经常需要对基准时钟进行不同倍数的分频&#xff0c;进而得到各模块所需…

linux OutOfMemoryError 内存溢出排查

前言 内存溢出我会先分成两种情况。 一种是8g内存服务器分配给服务2g内存&#xff0c;导致服务内存溢出。 一种是8g内存服务器把内存全部分给服务导致的内存溢出。 也就是说一种是给服务加配置&#xff0c;一种需要调整服务的代码处理。 思路整理 日志排查 第一步应该是日志…

使用redis-cli命令实现redis crud操作

项目场景&#xff1a; 线上环境上redis中的key影响数据展示&#xff0c;需要删除。但环境特殊没办法通过 redis客户端工具直连。只能使用redis-cli命令来实现。 操作步骤&#xff1a; 1、确定redis安装的服务器&#xff1b; 2、找到redis的安装目录下 ##找到redis安装目…

用公网服务器实现内网穿透

首先需要一个公网服务器 下载frp 搜索github下载到frp&#xff0c;服务端frps/客户端frpc。。下载的时候要注意自己本地内网机的cpu版本和服务端cpu架构 我的电脑是mac M1PRO版本 下载的是&#xff1a;darwinarm64 比如 服务端一般是Linux&#xff08;Intel 64位CPU&#xf…

Red Hat8:搭建FTP服务器

目录 一、匿名FTP访问 1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 5、安装VSFTPD 6、 打开配置文件 7、设置配置文件如下几个参数 8、重启vsftpd服务 9、进入图形化界面配置网络 10、查看IP地址 11、安装ftp服务 12、遇到拒绝连接 13、测试 二、本地…