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

目录

一、认识库

​编辑

二、静态库

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:

cpp 复制代码
#pragma once    
                                                                                     
int Add(int a, int b);                                                                             
int Sub(int a, int b); 

mystdio.h:

cpp 复制代码
  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:

cpp 复制代码
#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

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

静态库的gcc选项:

cpp 复制代码
gcc main.c -I ./mylib/include/ -L ./mylib/lib/ -lmyc

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

--- 其实在含main函数的源文件里面就已经指定了 即#include ......
那我们可不可以自己指定头文件的路径及名称??

这是为什么呢??

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


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

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

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

相关推荐
muls112 分钟前
java面试宝典
java·linux·服务器·网络·算法·操作系统
斯班奇的好朋友阿法法16 分钟前
ollama离线导入大模型
服务器·前端·javascript
Eric.Lee202130 分钟前
python实现pdf转图片png
linux·python·pdf
剑锋所指,所向披靡!35 分钟前
linux的目录结构
linux·运维·服务器
zt1985q37 分钟前
本地部署 Home Assistant 高级自动化 AppDaemon 并实现外部访问
运维·服务器·网络·网络协议·自动化
我爱学习好爱好爱40 分钟前
Ansible变量介绍 vars变量 inventory针对主机设置变量
linux·自动化·ansible
结衣结衣.1 小时前
【Linux】命名管道的妙用:实现进程控制与实时字符交互
linux·运维·开发语言·学习·操作系统·交互
IMPYLH1 小时前
Linux 的 groups 命令
linux·运维·服务器·bash
默|笙1 小时前
【Linux】线程概念与控制(1)_线程概念_分页式储存管理
linux·运维·服务器
Lugas Luo1 小时前
SATA 协商流程深度分析 (基于 libata 与 AHCI 控制器)
linux·嵌入式硬件