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

相关推荐
地衣君12 分钟前
Ubuntu 配置使用 zsh + 插件配置 + oh-my-zsh 美化过程
linux·运维·ubuntu
2401_8582861114 分钟前
OS11.【Linux】vim文本编辑器
linux·运维·服务器·编辑器·vim
朱包林23 分钟前
day27-shell编程(自动化)
linux·运维·服务器·网络·shell脚本
layman052823 分钟前
OpenEuler服务器警告邮件自动化发送:原理、配置与安全实践
服务器·鸿蒙系统·openeuler
kaede31 分钟前
Linux实现线程同步的方式有哪些?
linux·运维·云计算
德先生&赛先生32 分钟前
Linux编程:2、进程基础知识
linux
子正1 小时前
一键编译包含多个独立模块和应用的工程(linux cmake)
linux·运维·cmake
小阳睡不醒1 小时前
小白成长之路-Linux Shell脚本练习
linux·运维·服务器
dessler2 小时前
代理服务器-LVS的DR模式
linux·运维·云计算
梦星辰.2 小时前
VSCode CUDA C++进行Linux远程开发
linux·c++·vscode