编译过程
我们知道代码运行需要经过四个阶段:预处理,编译,汇编,链接;
1.那么这四个阶段分别执行哪些操作呢?
这里用一个名为hello.c的文件进行说明:
图1:
当我们需要把hello.c的文件进行编译时
命令:gcc hello.c -o hello.exe
图2:
可以看到这里直接生成了一个可执行程序hello.exe
那么如果我们把步骤拆分呢?
图3:

图4:
图5:

图6:
这里的hello和hello.exe是一样的,打印之后我们可以看到。
图7:
我们写代码的时候,实现一个函数需要返回值,函数名,参数等等;但其实printf也是一个函数!
2.那为什么我们的printf函数并没有实现但是可以执行成功呢?
我们包含了头文件,头文件中包含这些函数的声明可以让我们的程序正常执行到第四阶段——链接阶段。在链接阶段中,程序会把.o文件(可重定位二进制文件)和语言库中的库文件进行链接,也就相当于这就是一个真正的可执行程序;
3.那什么是库文件呢?
我们在下载vs2019的时候,它会让你会选择下载你需要使用的功能,这就是在下载相应的语言库,语言库里面包含很多专业人员写出的代码 例如printf,所以你才可以这么轻松地写完代码并进行执行。库文件分为静态库和动态库。
4.那么动态库和静态库有什么区别呢?
在windows中 动态库文件 后缀为.dll,静态库后缀为.lib。但是在Linux中,静态库名称为 libxxx.a,动态库为libxxx.so。
静态库:链接的时候直接把库里面的代码拷贝一份到你的源文件里面去。
动态库:链接的时候把所需要的库里面的 函数地址放到到你的源文件相应的地方去。
所以我们可以看到下图所示,利用静态库的可执行程序文件远远大于动态库;
图8:
所以一般云服务器都是用的是动态库。
图9:
注:ldd命令是打印共享库列表,也就是动态库
图10:
注:file命令用来识别文件类型,也可用来辨别一些文件的编码格式