在正式使用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工具链包括:
- GNU Compiler Collection(GCC):这里GCC纯指编译器,包括链接等其它操作
- GNU Make:编译和构建工程的自动化工具,即Makefile
- GNU Binutils:二进制工具,包括链接器和汇编器
- GNU Debugger(GDB):著名的gcc下调试工具
- GNU Autotools:可以构建Makefile
- 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安装方式包括MinGW和Cygwin。本文的操作环境就基于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。
我们就将上面的程序存储到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了,然而,其实你还差远了:
- 你知道怎么生成汇编文件吗?
- 你知道怎么编译c++文件吗?
- 你知道怎么查看预处理之后的结果吗?
- 你看VC++,人家都会编译生成*.obj的文件,你知道怎么使用gcc编译得到吗?
- 你知道怎么编译多个文件吗?
- 你知道怎样才能调试吗?
- ……
如果你有哪项不知道,不着急,请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代码的汇编代码,