好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

GCC起步

GCC起步

gcc使用  

 在学习使用 GCC 之前,下面的这个例子能够帮助用户迅速理解 GCC 的工作原理,并将其立即运用到实际的项目开发中去。首先用熟悉的编辑器输入清单 1 所示的代码:

  清单 1 : hello.c 

#include 
int main(void)
{
printf ("Hello world, Linux programming!//n");
return 0;
}

然后执行下面的命令编译和运行这段程序:

# gcc hello.c -o hello
# ./hello
Hello world, Linux programming!

从程序员的角度看,只需简单地执行一条 GCC 命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的工作。首先, GCC 需要调用预处理程序  cpp ,由它负责展开在源文件中定义的宏,并向其中插入 “#include” 语句所包含的内容;接着, GCC 会调用 ccl 和 as 将处理后的源代码编译成目标代码;最后, GCC 会调用链接程序 ld ,把生成的目标代码链接成一个可执行程序。
  为了更好地理解 GCC 的工作过程,可以把上述编译过程分成几个步骤单独进行,并观察每步的运行结果。第一步是进行预编译,使用 -E 参数可以让 GCC 在预处理结束后停止编译过程:

# gcc -E hello.c -o hello.i

此时若查看 hello.i 文件中的内容,会发现 stdio.h 的内容确实都插到文件里去了,而其它应当被预处理的宏定义也都做了相应的处理。下一步是将 hello.i 编译为目标代码,这可以通过使用 -c 参数来完成:

# gcc -c hello.i -o hello.o

GCC 默认将 .i 文件看成是预处理后的 C 语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译过程,也可以使用 -x 参数让 GCC 从指定的步骤开始编译。最后一步是将生成的目标文件链接成可执行文件:

# gcc hello.o -o hello

在采用模块化的设计思想进行软件开发时,通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用 GCC 能够很好地管理这些编译单元。假设有一个由 foo1.c 和 foo2.c 两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序 foo ,可以使用下面这条命令:

# gcc foo1.c foo2.c -o foo

如果同时处理的文件不止一个, GCC 仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令:

# gcc -c foo1.c -o foo1.o
# gcc -c foo2.c -o foo2.o
# gcc foo1.o foo2.o -o foo

在编译一个包含许多源文件的工程时,若只用一条 GCC 命令来完成编译是非常浪费时间的。假设项目中有 100 个源文件需要编译,并且每个源文件中都包含  10000 行代码,如果像上面那样仅用一条 GCC 命令来完成编译工作,那么 GCC 需要将每个源文件都重新编译一遍,然后再全部连接起来。很显然,这样浪费的时间相当多,尤其是当用户只是修改了其中某一个文件的时候,完全没有必要将每个文件都重新编译一遍,因为很多已经生成的目标文件是不会改变的。要解决这个问题,关键是要灵活运用 GCC ,同时还要借助像 Make 这样的工具。

作者: Leo_wl

    

出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于GCC起步的详细内容...

  阅读:40次