文件IO&标准IO 动态库&静态库 编译过程

什么是标准IO:
标准IO是基于C库 的——大部分操作系统都支持C库,所以大部分系统都可以使用标准io,标准IO就是input/output.我们的输入输出都是要经过系统调用的。就是内核的文件系统来统一管理的,要不然你随便输入输出这怎么行?比如你标准输出流stdout 你也的经过系统调用才能把信息发送到屏幕的这个文件设备,然后显示。

文件IO:
文件IO是基本的IO,可以使用文件IO,对文件进行IO操作。Linux一切皆文件,所以你可以使用文件io打开任何一个文件。比如对设备进行io你就可以open /dev目录下的设备文件。

标准io和文件io的区别:
标准IO有缓冲机制:有全缓冲 行缓冲 无缓冲之分 。比如我scanf 的时候要往stdin里面输数据,什么情况代表数据输入完成?
就是我们按回车的时候,这个数据就发给stdin了,那么回车是什么?为什么按回车就可以写进去?在windows下你要是文本编辑回车键就是一个换行键。那么你stdin的时候按回车就是按了一个换行——————证明我们的stdin是行缓冲
缓冲机制带来的好处就是减少系统调用——如果你是无缓冲的你要发一个hello world!那么你可以要进行很多一次系统调用。如果你用了缓冲机制,你就可以先把数据放在缓冲区,等你整句发完了,你再系统调用,这样只需要一次系统调用。

文件io:没有缓冲机制,常用于打开文件
文件IO&标准IO 动态库&静态库 编译过程
图片用的别人的(我的资源大家也可以随便用,不用跟我客气)
————————————————————————————
静态库和动态库

什么是静态库什么是动态库

静态库就是在程序编译的时候把支持程序运行的库文件的相关代码复制到程序中(不是整个库文件都复制,你用了什么就复制什么),这样程序就算在其它没有这个库文件的系统上也能运行。这就很类似我们在QT的时候,可以在QTcmd下通过命令把支持QT运行的程序打包到一起,这样整个QT程序在任意一台电脑上都可以运行是一个道理。

静态库的制作:静态库文件一般以.a结尾。通过命令
ar crs libhello.a hello.o
把hello.o文件转化成库文件,而.o文件是由.c文件编译而来

动态库:动态库就是需要在编译的时候动态链接。在程序编译的时候编译器动态的从库文件去找要的支持。比如我们在写线程的时候,一般都会忘了:gcc pthread.c -o pthread -l pthread 这个-l 就是动态链接库

动态库的制作:
gcc -c -fPIC hello.c -Wall //生成hello.o的目标文件 -fPIC的意思是位置无关代码,动态运行的位置不固定
gcc -shared -o libhello.so.1 hell.o //生成动态库 .1代表版本号
ln -s libhello.so.1 libhello.so //为动态库创建链接文件

那么动态库他是动态链接的 -l 链接,那么你上哪找库文件啊?、?
1)你把库文件加到/bin文件下面
2)使用绝对路径
3)把库文件添加到全局环境变量

好:讲一下动态库和静态库的优缺点:
动态库:
优:程序不包含库中代码,减少代码体积,库升级更加方便,无需像静态库一样重新编译
缺:程序运行时需要加载库,换一个环境就不能使用’

静态库的优点就时动态库的缺点。。。。。

————————————————————————————
编译过程
文件IO&标准IO 动态库&静态库 编译过程
这图片是我之前的
我们编译一个gcc test.c -o test cpu的编译过程 -o 是要生成的目标文件
1)预处理 :gcc -E test.c -o test.i
预处理进行的是:注释的删除,和宏的展开和替换
2)编译:gcc -S test.i -o test.s
编译进行的是把C语言转化成汇编
3)汇编:gcc -c test.c -o test.o
汇编将汇编代码转化成二进制机器码
4)链接:gcc test.o -o test
链接:把支持的库翁文件链接起来包括动态库和静态库

上一篇:Linux GCC常用命令以及GCC编译器的初步学习


下一篇:CF850A Five Dimensional Points 题解