******************************************************************************************
.c 所写c源文件
进行预处理
.i c文件替换宏,头文件包含(头文件中内容放在源文件开头)等后的文件
.ii cpp文件替换宏,头文件包含(头文件中内容放在源文件开头)等后的文件
进行编译
.s (将 .i 文件编译而生成的)汇编文件(可能有很多个)
进行汇编
.o .obj 目标文件,为二进制机器代码
进行(多个文件)链接
生成可执行文件,在windows下为.exe,linux下.out
******************************************************************************************
所用gcc命令:
gcc -E hello.c -o hello.i gcc -E -o hello.i hello.c
// 效果相同顺序不敏感
// -E编译选项表示仅进行预处理
// -o选项表明指定输出文件名,即将hello.c预处理为hello.i
gcc -S -o hello.s hello.i
// -S选项表示只激活预处理和编译,就是指把文件编译成为汇编代码 .s 汇编文件
gcc -c -o hello.o hello.s
// -c选项表示激活预处理编译汇编,不链接,因此生成的是 .o 目标文件
gcc -o hello hello.o
// 不加选项,激活所有过程,生成可执行文件,windows下指定为无后缀也会生成 .exe 可执行文件
******************************************************************************************
// 其中,被执行命令的文件为何文件不重要,即:
// gcc -o hello hello.xxx
// 其中xxx为o、i、s、c均能执行命令,将直接生成至被激活的最后一个状态,此处因为
// 没有加任何编译选项,生成至可执行文件 . exe
******************************************************************************************
库文件
静态库的代码在编译的过程中已经载入到可执行文件中,所以最后生成的可执行文件相对较大
动态库的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,所以最后生成的可执行文件相对较小
静态库和动态库的最大区别是,静态库链接的时候把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度和降低程序的耦合度。
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件
理解不到位,粘贴一份日后看
标签:可执行文件,文件,gcc,生成,编译,8.21,随笔,hello From: https://www.cnblogs.com/Willard-Wong/p/16610447.html