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

相关推荐
怀旧6665 分钟前
如何运行第一个Tomcat HttpServlet 程序
java·服务器·后端·tomcat·个人开发
捕鲸叉18 分钟前
怎样在Linux PC上调试另一台PC的内核驱动程序,以及另一台Arm/Linux上的程序和驱动程序
linux·arm开发·软件调试·诊断调试
孤寂大仙v18 分钟前
【Linux】进程状态
linux·运维·服务器
原谅我很悲21 分钟前
在VMwareFusion中使用Ubuntu
linux·运维·ubuntu
Zfox_1 小时前
【Linux】应用层自定义协议与序列化
linux·服务器·c语言·c++
杰克崔2 小时前
通过内核模块按fd强制tcp的quickack方法
linux·运维·服务器·网络·tcp/ip
m0_748239632 小时前
SQL2000在win10上安装的方法
运维·服务器
程序设计实验室2 小时前
SSH 跳板机原理与配置:实现无缝跳板连接,一步直达目标主机
linux
Channing Lewis2 小时前
Python 3.9及以上版本支持的新的字符串函数 str.removeprefix()
服务器·python