基础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 修饰,则会强制静态链接

相关推荐
IpdataCloud2 分钟前
高精度IP定位服务怎么评估?从数据源、精度层级到实测验证的完整框架
服务器·网络·tcp/ip·ip
程序员-Benothing2 分钟前
Linux CPU性能分析:top、mpstat、pidstat、perf实战
linux·运维·服务器
William.csj4 分钟前
Bitvise SSH Client——配置跳板机:通过中转服务器连接内网服务器
运维·服务器·ssh
小诗懂技术8 分钟前
Linux设备驱动并发控制总结_CSDN
linux·运维·服务器
Y38153266218 分钟前
SerpBase + RAG 实战:用搜索 API 给知识库接上实时数据,回答不再过期
java·服务器·数据库
北风toto23 分钟前
银河麒麟 V10 内网 YUM 源修复实战教程(U盘中转版)
linux·服务器
韩曙亮26 分钟前
【错误记录】网络配置问题处理 ( 获取服务器的 出口 和 入口 IP | 定位网络变化 )
服务器·网络·tcp/ip
开开心心就好27 分钟前
文件关联被破坏怎么修?免费工具一键修复
java·服务器·开发语言·pdf·ocr·启发式算法·宽度优先
小白鸽i28 分钟前
【linux】麒麟桌面版安装人大金仓V8
linux·运维
Ruiery33 分钟前
Linux 6.6内核内存管理深度解析(三):页表与缺页处理 — 虚拟地址怎么按需映射到物理页
linux·运维·服务器