`
lovecontry
  • 浏览: 1035702 次
文章分类
社区版块
存档分类
最新评论

编译器GCC使用

 
阅读更多

编译器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 用不了 郁闷了 其实可以在程序中设置打印来调试 一样的

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics