(1)库文件:某些功能模块的集合,项目之间代码的共享,模块化开发。预先编译好的方法的集合。好比:咱们提早写好一些数据公式的实现,将其打包成库文件之后只需使用库文件便可,而不须要从新编写。linux
(2)静态库和动态库(共享库)的区别windows
静态库: windows .lib linux .a模块化
静态库在连接过程当中使用,使用静态库编译的的可执行程序包含静态库的内容,因此可执行文件的执行不依赖静态库。(静态库是功能的“.o”的集合)函数
动态库: windows .dll linux .sospa
动态库在执行过程当中使用,在执行中须要动态库的支持,将动态库动态加载到内存中,因此可执行文件的执行依赖动态库。(是没有main函数的可执行文件)操作系统
静态库在连接过程当中,将代码拷贝到可执行文件当中,当它屡次被使用时就会有多份没用的拷贝存在内存中,固然在程序文件自己中也存在重复代码,这浪费了许多内存和磁盘空间。而动态库在运行时才被加载到内存中,不一样的程序能够获得内存中相同的动态库的副本,这就为咱们节省了内存空间。模块化开发
(3)静态库的生成blog
3.1)将源文件编译生成中间文件(*.o)接口
3.2)ar crv libxxx.a *.o(全部的中间文件)内存
3.3)gcc -o main main.c -L -lxxx
-L 指定静态库路径 -l 指定静态库名称
(1)动态库的生成
gcc -shared -fPIC -o libxxx.so *.c
gcc -o main main.c -L -lmath
库函数:在函数库文件中。执行时在用户态中。库函数可能还会转调系统调用函数,好比:fopen,printf 。也可能不须要,好比:strlen,strcopy
系统调用(英语:system call):指运行在用户空间的应用程序向操做系统内核请求某些服务的调用过程。 系统调用提供了用户程序与操做系统之间的接口。通常来讲,系统调用都在内核态执行。因为系统调用不考虑平台差别性,由内核直接提供,于是移植性较差(几乎无移植性)。在内核中实现。
系统调用函数触发0x80中断,将相应系统调用号存入eax寄存器中,陷入内核,内核开始执行中断处理程序,在系统调用表中查找对应的系统内核函数并调用,执行完成后将数据经过eax寄存器带到用户空间。