一.基本选项
GCC是开源软件中顶级的c编译器
gcc -Wall -o hello hello.c
-W打开警告选项
全部打开
-v显示详细信息
-c只编译生成对象文件,不生成可执行文件。 生成. o文件
虽然GCC没有链路排名问题,但是希望遵守后面定义和前面调用的规则
有效管理庞大的项目,有make
二.链接外部库
标准库:
gcc-wall main.c/usr/lib/libm.a-ocalc
gcc -Wall main.c -lm -o calc
-lm相当于libm.a (仅限标准库)
使用此选项可以使用头文件
-I选项指示在其中搜索头文件的目录
gcc-wall-I/opt/my soft/include-omain
-L指定要搜索的库文件目录
指定环境变量
如果同时定义了-I、-L和环境变量,则优先查找-I和-L;如果找不到,则查找环境变量;如果尚未找到,则查找系统路径
建议使用-I,-L方法
三、建立自己的资源库
ar命令:将许多目标文件. o合并为一个库文件
arcrlibname.afile1. ofile2. o . filen.o
检查库中有多少目标文件
ar t libName.a
gcc-wall-cmain.clib func.a-o hello
不能更换-c main.c和libFunc.a的顺序
gcc -Wall main.c -L. -lfunc -o hello
gcc-wall main.c-l/home/Baiyun/study/my soft-l func-o hello
四.动态库和静态库
. lib .a
. dll .so
使用ldd a.out验证a.out所需的动态库
五、c语言标准
gcc不带选项时,使用GNU标准编译,带-ansi,-std,最新版为-std=c99
gcc-wall-ansi-d _ GNU _ source pi.c-opp
使用标准c进行编译,链接时使用GNU的库
-ansi -pedantic两个参数连用时,严格按照标准c调用
六.-Wall选项
-沃尔是以下聚会
“-Wcomment”(用于检测注释是否嵌套) )。
'-w format ' (用于检测传递给printf和scanf的值类型是否正确() )。
'-Wunused ' (用于检测变量是否已声明但未使用) ) )。
'-Wimplicit ' (用于检测是否正在使用未声明的函数) )。
'-Wreturn-type ' (用于检测函数声明中有返回值但实现中没有返回值() )。
'-W '
'-Wcnversion '
'-Wshadow '
'-Wcast-qual '
'-Wwrite-strings '
'-Wtraditional '
七.预处理
gcc -Wall -DTEST main.c -o ouput
-D后面跟预处理定义的宏
要向预定义宏中添加值,请执行以下操作:
gcc -Wall -DNUM=123 main.c o ouput
gcc -Wall -DNUM='1 2' main.c o ouput
如果不为宏设置值,则默认值为1
如果不想编译,只需要看到预处理过程,请使用-E参数。 (以下两个也可以。
gcc -E test.c
gcc -Wall -c -save-temps test.c生成. I和. s文件, s文件是汇编语言, I文件是预处理结果, I文件是c语言预处理结果, ii是c预处理结果
查看GCC中的预定义宏
CPP-DM/dev /空值
八.编译的功能调试
-g指令允许编译器在可执行文件和目标文件中存储其他调试信息。 通过这些信息,可以将机器代码信息和源程序信息联系起来。 GCC的调试器是GDB
Coredump文件分析
gdb a.out core.2297
九、编译优化
编译器可以生成不同平台上的可执行文件。
1、源代码级优化,不需要机器码知识
(1)、通用子表达式删除) CSE ),重用已经计算出的变量
(2)、嵌入函数(FL ) ) ) ) )。
(3)、循环优化开关gcc-wall-O3-fun roll-loops test.c-o test
2、机器码水平优化
3、优化水平:
gcc -OLEVEL
级别=0- 3
0表示不进行优化
水平越高,优化的强度越大
十、优化与调试
优化和调试通常是不一致的,GCC允许同时使用优化和-g,并且可以同时进行优化和调试
十一、编译c程序
GNU的c编译器实际上是真正的c编译器,它将c直接编译成汇编语言,然后转换成机器码。 实际编译器将c语言转换为c语言,转换为汇编,然后再转换为机器代码。 因此,GCC编译器生成的c程序性能更高。 编译c的过程与编译c的过程相同,只是使用g命令,
gcc和g的大多数命令是相同的。
因为g搜索c的标准库,所以c的目标文件必须用g链接
十二、编译如何工作
编译过程由多个阶段组成,每个阶段使用的工具都不同,其中包含许多称为工具链的工具。
包括以下步骤:
1、预处理
2、将源程序编译成汇编语言
3、汇编语言源程序编译成最终机器码,生成目标文件
4、建立最终执行文件
1、进行cpp hello.c -o hello.i预处理,生成hello.i文件
2、将gcc -Wall -S hello.i编译为汇编语言,生成hello.s文件(编译为汇编语言的源程序用-S参数表示) ) ) ) ) )
3、as hello.s -o hello.o生成目标文件
4、生成gcc hello.o可执行文件
十三、与编译有关的两个工具
1、优化器gprof
gcc -Wall -pg main.c -o pro
-pg参数将GCC的部分测试代码插入可执行文件中,并计算函数执行的时间和次数
程序运行完成后,将生成gmon.out文件,并使用gprof gmon.out显示信息
2、覆盖测试工具gcov
可以发现程序中的哪些代码从未调用过
gcc-wall-f配置文件- arcs-ftest-coverage cov.c
生成cov.gcno
运行程序后,生成cov.gcda
使用gcov cov.c进行检查
生成cov.c.gcov