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.cpp文件中的内容,会发现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这样的工具。
分享到:
相关推荐
gcc 编译 优化 选项 英文的编译器优化选项
GCC编译命令 Gcc命令行详解 Gcc命令行详解 Gcc命令行详解
arm-linux-gcc编译选项,包括相关参数的详细说明等等。
GCC编译工具GCC编译工具GCC编译工具GCC编译工具GCC编译工具
gcc编译原理代码demo,gcc/g++命令使用及编译原理二https://blog.csdn.net/yfldyxl/article/details/81450843
gcc编译过程概述.pdfgcc编译过程概述.pdf
windows平台arm-gcc编译环境搭建(资源包及搭建步骤,及测试demo) windows平台arm-gcc编译环境搭建(资源包及搭建步骤,及测试demo) windows平台arm-gcc编译环境搭建(资源包及搭建步骤,及测试demo) windows平台arm-...
Linux 内核和许多其他自由软件以及开放源码应用程序都是用 C 语言编写并使用 GCC 编译的。
在vscode下使用armgcc编译gd32f407程序,包含相关配置文件,经过测试可以下载、调试。
通过学习,学会了GCC编译的基础知识,makefile制作等。非常适合Linux初级开发开发者学习。相信你看完资料,按资料把代码都编写了,您也就能使用基本的GCC(G++)功能了,个人认为其弥足珍贵。(在Linux环境下阅读...
GCC编译优化指南【作者:金步国】.pdf
配合文章:nordic52832 nordic使用gcc编译环境搭建和使用说明
stm32代码在ubuntu linux使用gcc编译的链接文件 link.ld 具体参考博客: http://blog.csdn.net/embbnux/
gcc编译系统结构分析与后端移植
AVR-GCC 编译程序方法图解
GCC编译环境配置(VSCode).pdf
avrgcc编译程序方法图解 avrgcc编译程序方法图解 avrgcc编译程序方法图解 avrgcc编译程序方法图解 avrgcc编译程序方法图解
C++编写的共享库,用gcc编译连接,分别生成.so和.a,C编写的main,用gcc编译,连接.so和.a调用的简单例子
详解Linux 下GCC 的编译过程及其编译选项、优化原理。。
当时Richard Stallman(GNU项目的创办人)想要创建一个编译器,它可以满足他定义的“自由软件”概念,并可用来编译GNU项目发布的其他软件。GNU C编译器迅速在自由软件社区中流行开来,而且以其健壮性和可移植性而...