目录
一、认识库
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:
cpp1 #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
cppgcc main.c -llibmyc.a // 该代码是不行的 // 因为库libmyc.a的真正名字是去掉 lib 和 .a gcc main.c -lmyc // 可以成功编译 gcc main.c -l myc // 也可以
静态库的gcc选项:
cppgcc main.c -I ./mylib/include/ -L ./mylib/lib/ -lmyc
为什么不需要指定头文件名称呢??
--- 其实在含main函数的源文件里面就已经指定了 即#include ......
那我们可不可以自己指定头文件的路径及名称??这是为什么呢??
只有当我们用双引号("")包含头文件时,系统才会考虑到当前工作路径去寻找头文件
我们的编译不是使用了我们的stdio和math库吗,为什么可执行文件中不包含?
若是gcc时,没有 -static 修饰,则是优先动态链接,没有的话会默认将静态库局部性的拷贝到可执行文件里面
有 -static 修饰,则会强制静态链接