【今日/总数】文章:2/2773 用户:4/10747 书籍:0/200
回顾2016,喜迎2017,以“回顾我与C++技术网的2016,展望C++技术网的2017”为主题,发表文章,将有机会赢得2个月的会员或现金红包。

当前位置:操作系统 -> Linux -> Linux编程入门(什么是GCC?)

原创版权标志Linux编程入门(什么是GCC?)

作者:codexia  发表时间:2016/12/15 10:12:59  阅读:121
[摘要]Linux编程第一步就是要正确的编译出Hello World,了解GCC是最基础的。
一、什么是GCC
Linux系统下的Gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。
gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
Gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。
在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。
而gcc则通过后缀来区别输入文件的类别,下面我们来介绍gcc所遵循的部分约定规则。
    
.c      是C语言源代码文件
.a      是由目标文件构成的档案库文件
.C/.cc/.cxx     是C++源代码文件
.h      是程序所包含的头文件
.i      是已经预处理过的C源代码文件
.ii     是已经预处理过的C++源代码文件
.m      是Objective-C源代码文件
.o      是编译后的目标文件
.s      是汇编语言源代码文件
.S      是经过预编译的汇编语言源代码文件

二、Gcc是怎样生成可执行文件的
虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶

(1) 预处理(也称预编译,Preprocessing)
调用cpp进行预处理,生成以.i为后缀的预处理文件,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。

(2) 编译(Compilation)
调用cc1进行编译,生成以.s为后缀的汇编源文件。

(3) 汇编(Assembly)
调用as进行汇编,生成以.o为后缀的目标文件。

(3) 连接(Linking)
调用ld来生成可执行文件,在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。

三、如何获取Gcc

http://gcc.gnu.org/install/binaries.html

各个系统下都有对应的版本

四、实例

实验环境: windows + MinGW

GCC位置: [MinGW目录]/bin/,其中 cc1.exe 位于 [MinGW目录]/bin/libexec/gcc/mingw32/4.4.1/

新建文件: hello.c

内容:
    
#include "stdio.h"
int main()
{
    printf("hello world!");
}

一步到位:
gcc.exe hello.c
当前目录下直接生成 a.exe 执行后直接显示 hello world!

分布拆解:

1、预处理: cpp.exe hello.c -o hello.i
如果你有兴趣可以用记事本直接打开hello.i 慢慢看

2、编译: [完整路径]\cc1.exe hello.i
如果你有兴趣可以用记事本查看生的成汇编源代码 hello.s

3、汇编: as.exe hello.s -o hello.o
生成目标文件 hello.o 如不设置默认为 a.out

4、连接: ld.exe hello.o
我这一步执行的时候失败了,按照网上资料所说是因为找不到main函数和printf函数入口。

这里设计了不少编译原理相关的东西,以后再慢慢研究,
即使如此,我们还是对gcc的工作原理有了初步了解

其他办法:
gcc.exe hello.c -save-temps
过程中的hello.i、hello.s、hello.o、hello.exe都会被保留
但是具体命令使用的参数不得而知
文章来源:C++技术网

原文地址:https://www.6zou.net/tech/what-is-gcc-compiler.html
当前位置:操作系统 -> Linux -> Linux编程入门(什么是GCC?)

返回顶部

关于我们 QQ群 广告服务 增值服务 捐款资助 版权声明 RSS订阅 站点地图 百度网站地图 意见反馈
鄂ICP备14001349号-2, Copyright © 2014-2017, CJJJS.COM/CJJJS.CN, All Rights Reserved

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)