.o与.obj区别:
没有太大区别,都是2进制文件
win下的.obj,linux下是.o
gcc编译流程:
预处理: 展开头文件/宏替换/去掉注释/条件编译
编译:将预处理后的文件转换成汇编语言(编译器做)
汇编:汇编转机器码,生成.s(汇编器做)
链接:连接目标代码,即.o(链接器做)
gcc常用命令:
-E 只激活预处理, 生成.i
-S 只激活预处理和编译 生成.s
-c 只激活预处理,编译,和汇编 生成.o
-o 制定目标名称,gcc默认的目标名是 a.out 生成a.out
-C 预处理的时候, 不删除注释信息
-g 只是执行编译器,并在编译的时候,产生调试信息。
-ggdb 生成 gdb 的可以使用的调试信息
-static 禁止使用动态库,直接可以运行
-share 尽量生成动态库,需要连接动态库再执行
-pipe 使用管道代替编译中临时文件:
gcc -pipe -o hello hello.c
-ansi 使用c++98标准去编译代码
-O0 、-O1 、-O2 、-O3
编译器的优化选项的 4 个级别,-O0 表示没有优化, -O1 为默认值,-O3 优化级别最高。
-include filename 相当于在代码中使用 #include<filename>
gcc hello.c -include /root/myfun.h
-I 指定头文件路径
-l 指定链接的库
-L 指定链接的库文件路径
-w 不生成警告信息。
-Wall 生成所有警告信息。
动态库与静态库
静态库:.so
动态库:.a
编译: 静态库(全部)载入可执行程序。
汇编: 汇编转机器码。
链接: 动态库(需要的)载入可执行程序。
目标文件和可执行文件(.o与a.out区别)
结构和内容相似,因此跟可执行文件采用同一种格式存储。
目标文件: (windows的COFF Linux的.o)
源代码编译后未进行链接的中间文件。(.c变.o)
常见的可执行文件格式主要有:
Windows 的 PE(Portable Executable)
Linux 的 ELF(Executable and Linkable Format)
都是通用目标文件格式(COFF,Common Object File Format)的变种。
在 Windows 下,目标文件文件(COFF文件)和可执行文件(PE文件)统称为 PE-COFF 文件。
Linux 统称为 ELF 文件。
linux默认生成的a.out原因: Unix 最初使用的a.out。