以前在Linux下gcc一个源于文件一直就gcc + xxx.cgcc/g++在实施编译工作的下。

早先在Linux下gcc一个来源文件直接就是gcc + xxx.c ,然后实施就ok了。

**转自:http://amao99.blog.51cto.com/968364/226193

近来透过了尤其的读书才懂得原来是历程实际上是连了季个步骤的。

gcc**编译器

1、预编译:

前提编辑工具的运用:vi  vim  Emacs。

为便是拍卖由#启的下令,gcc +  -E +源文件 + -o +
你想变的初的文书名(xxx.i)。

vi hello.c

例如:gcc   -E   hello.c   -o   hello.i 

平、常见步骤:

2、编译:

对此只有出一个来自文件的简单程序,常常单发生编译,运行两步。

拿转变的预编译文件编译成汇编文件。

1,gcc hello.c -o hello

gcc   -S    hello.i   -o   hello.s

2,./hello

3、汇编:

 

以汇编代码转换成机器码。

老二、gcc编译流程

gcc   -c   hello.s   -o   hello.o

gcc and g++分别是gnu的c & c++编译器
gcc/g++在实施编译工作的时刻,总共需要4步

4、链接:

hello.c  (源码) 

马上是终极一步了
,当你在次中以有函数时,为了落实这些函数,其实它们见面连至有涵盖这些函数的库(xxx.o),来实现完整的功能.

 

——————————————————————————-分割线——gdb基本命令下—————————————————————————

hello.i  生成预处理公事,

每当linux中gdb 是一个正确的调试程序的法子;

参数是“-E”,把hello.c -> hello.i。完整命令为gcc hello.c -o hello.i -E

进入gdb步骤:

 

1、gcc -源文件.c   -g   -o  test

hello.s  编译生成汇编文件, 

2、gdb test

参数是“-S”,把hello.i -> hello.s。完整命令为gcc hello.i -o hello.s -S

3、然后要就是是您可以将程序化成一略片一样略片的,这样有利于来查找错误;

 

君得经安装断点,查看断点,删除断点,进入函数,跑动程序,打印结果等等操作来分步骤找错误;

hello.o  将汇编文件化目标代码, 

365体育网址 1

参数是“-c”,把hello.s -> hello.o。完整命令为gcc hello.s -o hello.o -c

 

hello    链接目标代码,生成可执行程序, 

参数无,      把hello.o -> hello。  完整命令为gcc hello.o -o hello

 

./hello  (运行)

 

其三、gcc的主要参数

1,总体参数

-E                  只进行预编译,不举行其他处理

-S                  只是编译不汇编,生成汇编代码

-c                  只是编译不链接,生成目标文件“.o”

-o file             把出口文件输出及file里

-g                  在可执行程序中隐含标准调试信息

-v                  打印出编译器内部编译各过程的一声令下执行信息以及编译器的版本

-I dir              在峰文件之搜寻路径列表中补充加dir目录

-L dir              在仓库文件的寻路径列表中上加dir目录

-static             链接静态库

-llibrary           连接名为library的库文件

 

 

2,警告及失误参数。

-w     关闭警告

-ansi  显示不切合ANSI C标准语法的告诫信息

-pedantic

-Wall  跟踪调试的有力工具,最后养成使用这参数的惯。

 

3,优化参数。

通过参数“-On”来生成优化代码。其中n是一个象征优化级别的整数,较突出范围是从0到2要3.数字越充分优化的阶段越强,程序运行速度更是快。常因此-O2,因为她于优化长度,编译时间及代码大学里取得一个较不错之平衡点。比较:1-8.c(代码略)

gcc 1-8.c -o 1-8

time ./1-8

 

gcc 1-8.c -o 1-8 -O2

time ./1-8

流动:如下场合应避免优化代码。

(1)程序开发时。只有到软件发行或开发了时,才考虑针对最后生成的代码进行优化。

(2)资源受限时。如内存资源大紧张时(一些实时嵌入式设备)。

(3)跟踪调试时。优化可能会见去除、改写或成代码,从而使跟踪调试变得十分困难。

 

 

gdb调试器

gdb调试之莫是.c源文件而是可执行文件

1,编辑源文件。

例如,vi 1-9

添加如下内容

#include <stdio.h>

int min(int x, int y);

int main()

{

  int a1, a2, min_int;

  printf(“please input the frist int number:\n”);

  scanf(“%d”, &a1);

  printf(“please input the second int number:\n”);

  scanf(“%d”, &a2);

 

  min_int = min(a1, a2);

  printf(“the min number is:%d\n”, min_int);

 

  return 0;

}

 

int min(int x, int y)

{

  if (x < y)

    return x;

  else

    return y;

}

 

2,编译时若长选项“-g”,这样编译出的只是实行代码才含有调试信息。

gcc 1-9.c -o 1-9 -g

 

3,进入gdb调试环境。

gdb 1-9

扭转车即使进了gdb调试模式。在gdb的调节环境受到,提示称是“(gdb)”。

 

4,用gdb调试程序。

(1)查看源文件

语法:’l’是list缩写。list<行号>|<函数名>。查看源代码,一坏展示10履行

命令  (gdb)l 

 

(2)设置断点

语法:break 行号|函数名<条件表达式>

本例可以输入指令

(gdb)b min  在自定义的min函数出设置断点。

(gdb)b 17   功能及齐

禁绝断点disable 断点号.删除delete  断点号

 

(3)查看断点信息

语法:info break

命令  (gdb)info b

 

(4)运行程序

语法:run

命令  (gdb)r

横流:gdb默认从第一执行开始运行,如果如由出现中指定行开始运行,只待输入“r”+行号。

 

(5)查看变量值

语法:p 变量名。程序运行到断点处会自动刹车,此时而查看指定变量的值。

本例命令 

(gdb)p a1

(gdb)p a2

(gdb)p min_int

调试程序时,如要修改变量值,可于程序运行365体育网址至断点处是,输入“set
变量=设定值”。

例,给变量“a2”赋值11,输入“set a2=11”。

 

(6)单步调试

语法:

“n”(next),若发生函数,不上函数调用。

“s”(step),若有函数,则进函数调用。

 

(7)继续运行程序

语法:continue

命令  (gdb)c

 
(8)finish运行程序直到目前函数结束

 

(9)退出gdb调试环境。

语法:quit

命令  (gdb)q

相关文章