实例学习gcc+gdb+make

1 小侃GCC

在正式使用gcc之前,我们先来侃侃gcc是啥玩意儿?

历史

现在的GCC是GNU Compiler Collection的简称,既然是Collection,就是指一些工具链的集合。

最初的GCC(当时还只有C编译器,GCC还是GNU C Comiler的简写)是由Richard Stallman开发的,Stallman也是GNU工程的首创者,那时还是在1984年。

随着程序设计语言的发展,GCC逐渐开始支持C语言之外的语言,如C++、Objective-C、Java、Fortran以及Ada等,详细可访问GCC主页http://gcc.gnu.org/

GNU工具链包括:

  1. GNU Compiler Collection(GCC):这里GCC纯指编译器,包括链接等其它操作
  2. GNU Make:编译和构建工程的自动化工具,即Makefile
  3. GNU Binutils:二进制工具,包括链接器和汇编器
  4. GNU Debugger(GDB):著名的gcc下调试工具
  5. GNU Autotools:可以构建Makefile
  6. GNU Binson

本文主要讨论gcc,gdb和Makefile的使用。

另外,这里指的gcc还包括了用于编译c++的工具,我们实际使用的g++命令其编译过程调用的是与C语言gcc相同的工具,只不过链接过程有所不同。如无特殊说明,gcc命令的使用g++命令上也都适用。

安装

GCC版本比较多,还有应用在嵌入式ARM、AVR等平台的交叉编译工具,在RHEL/CentOS Linux下,只要使用

yum install gcc
yum install g++
yum install gdb

默认情况下一般是安装好的。

在Window下,可选择的gcc安装方式包括MinGWCygwin。本文的操作环境就基于Cygwin,Cygwin是一个Window下模拟Linux环境的开源软件,除了能使用gcc、gdb等工具外,还能使用其它许多Shell命令,操作方式与Linux下的终端无太大区别。本文后面讲述到的所有操作都是基于终端的。

版本及帮助

安装好了工具后,使用

gcc --version
gdb --version

可分别查看gcc和gdb的版本信息,

你可使用下面的,

gcc --help
gdb --help
g++ --help

或下面的命令获得关于gcc以及gdb的帮助信息。在使用gcc时偶尔会忘掉一两个参数,这几个命令就非常有用。

man gcc
man gdb 
man g++ 

如果在你看来,上网不是那么麻烦的话,则http://linux.die.net/man/1/gcc也可以获得gcc的帮助信息。

2 GCC的使用

好吧,我们现在开始第一个例子(我只熟悉C语言,我们这里讨论的例子都是C语言的例子)。

又遇到学习C语言时的第1个例子——Hello, world!,只不过这次我们更应该说Hello, GCC。

#include <stdio.h>
int main(void)
{
   
    printf("Hello, world.\n");
    printf("Hello, GCC.\n");

    return 0;
}

我们就将上面的程序存储到main.c的文件中,下面请跟着我敲命令吧,

gcc main.c
ls

在敲ls命令后你看到了什么?main.c目录下多了个a.exe的程序(Linux下可执行程序是a.out)。好吧,既然你是exe格式,运行吧,

./a.out

看到什么,没错:Hello, GCC.

NOTES:
在Linux/Cygwin下执行程序使用"./可执行文件名"。默认不设置时可执行文件名为a.out或a.exe。

到此,你就该说,我已经会使用gcc了,然而,其实你还差远了:

  1. 你知道怎么生成汇编文件吗?
  2. 你知道怎么编译c++文件吗?
  3. 你知道怎么查看预处理之后的结果吗?
  4. 你看VC++,人家都会编译生成*.obj的文件,你知道怎么使用gcc编译得到吗?
  5. 你知道怎么编译多个文件吗?
  6. 你知道怎样才能调试吗?
  7. ……

如果你有哪项不知道,不着急,请Go on!

在这之前,你必须了解C代码生成可执行文件的过程,共4步:预处理、编译、汇编、链接。

gcc生成可执行文件的过程

还是Hello, GCC的例子,请跟着敲命令,

gcc main.c -o main

-o 选项表示生成目标文件名为main.exe。

gcc -E main.c -o main.i

-E 选项表示预处理操作,预处理就是将宏定义展开,头文件展开。预处理之后的目标文件保存在main.i,这时,你可以查看main.i的预处理结果,

cat _main.c
gcc -S main.c -o main.s

-S 选项表示编译操作,其结果将生成汇编文件(*.s文件,这里使用-o选项定义目标文件为main.s)。我们也可以查看分析上述Hello代码的汇编代码,

    .file   "main.c"
    .def    ___main;    .scl    2;  .type   32; .endef
    .section .rdata,"dr"
LC0:
    .ascii "Hello, world.\12\0"
LC1:
    .ascii "Hello, GCC.\12\0"
    .text
.globl _main
    .def    _main;  .scl    2;  .type   32; .endef
_main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $8, %esp
    andl    $-16, %esp
    movl    $0, %eax
    addl    $15
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值