编译器GCC使用
1.GCC概述:
GCC(GNU C Compile)经过长时间已经发展成是支持C语言C++,java等众多语言的编译器
gcc的编译流程分为四步:1.预处理(pre-processing), 2.编译(Compiling), 3.汇编(assembling). 4.链接(linking)
gcc 根据不同的后缀对他们程序进行分别处理,.c为C原始程序、.C/.cpp为C++语言程序,……
2.GCC编译分析:
gcc [option | filename] option:编译选项 filename:要编译的文件名
现在我们编写一个最简单的程序hello.c
#include <stdio.h>
#include <stdlib.h>
main()
{
printf("hello linux\n");
return 0;
}
运行
#gcc hello.c -o hello
#./hello
屏幕上将打印 hello linux
介绍一下常用的 常用的编译选项
-o out_filename :可以确定生成的可执行的文件的文件名(若没有则编译出来时默认为a.out可执行文件)
-c : 只编译,而不连接成可执行文件,只是有.c文件生成.o文件
-g: 产生调试工具所用的调试符号信息(如果所编译的程序想要调试就需要加-g)
-O, -O2,-O3: 优化编译连接 是执行的更迅速 -O的优化<-O2的优化<-O3的优化(不加是默认是-O)这个只在你的程序已经确定没有错误,可以发布时才去进行优化 平时就不用了
-staic 静态编译(这里我把用静态编译的生成文件叫hello1)我来来与hello作个比较
我们看到hello1要比hello大很多 用file看文件属性 看到一个是静态编译 一个是动态编译 静态编译时把所需的库添加在其中一起编译了 所以要大很多(在嵌入式开发中如果没有指定动态库 就要用-static来编译你的程序)
-l dir 指定头文件的位置
-L dir:知名文件库的路径
-lname: 编译时装载libname.a 的库函数
例如要用到数学函数库 就要用 gcc -lm hanshu.c -o hanshu //因为要用到libm.a的函数库
调试工具gdb使用:
1.gdb概述:
gdb也是有GNU发布的一款功能强大的程序调试工具
主要完成:
1.能运行程序,并设置运行的参数
2.能够使程序在某条件下停住
3.能够在程序停止调查程序状态
4.能够根据所设的参数改变程序的运行
2.gdb调试应用:
编写一个test.c文件
#include <stdio.h>
#include <stdlib.h>
main()
{
int t;
long result = 0;
for(i=1;i<100;i++)
{
result +=i;
}
printf("result = %d",result);
return 0;
}
首先要用 gcc-gtest.c -o test
产生一个可以调试的 test 可执行文件
(1).启动gdb:#gdb test 或者 #gdb回车后加文件
(2).查看程序:list(l)
(3).设置断点: break(b) 行号--在制定行号添加断点 break(b) 函数名--在制定的函数入口设置断点 break(b) 行号 if 条件--当条件为真时断点生效 info--查询所有设置的断点 delete 编号--删除断点
(4).运行程序: run(r)
(5).单步运行: next(n)-->不会进入子函数 step(s)-->回进入子函数
(6).继续运行程序: continue(c)
(7).查看制定变量: print(p)变量名
(8).对制定变量进行监控: watch 变量名
(9).退出: quit(q)
忽然我的gdb 用不了 郁闷了 其实可以在程序中设置打印来调试 一样的