编译:当前源代码编译成二进制目标文件(.obj文件)

链接(link):将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件)。

 

一个现代编译器的主要工作流程如下:

源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables)

 

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

 

1.预处理(也称预编译,Preprocessing):命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。

 

2.编译(Compilation):接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。

 

3.汇编(Assembly):汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。

 

4.链接(Linking):当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到 的库函数也从各自所在的档案库中连到合适的地方。

 

实例:

1.编写.c文件如下:

#include <stdio.h>

int main()

{

printf("This is my first c program in ubuntu");

return 0;

}

 

2.预编译过程:

gcc -E ./hello.c -o hello.i //.i 为后缀的文件,是已经预处理过的C源代码文件,可以省略这一步。

cat hellp.c | wc -l //查看hello.c文件内容的行数。

cat hellp.i | wc -l //查看hello.i文件内容的行数。

 

3.汇编过程:

gcc -S hello.i -o hello.s //.s为后缀的文件,是汇编语言源代码文件;可以省略这一步。

 

4.编译过程

gcc -c ./hello.c //在当前文件夹下生成hello.o .o为后缀的文件,是编译后的目标文件;

gcc -c hello.c -o hello.o //在当前文件夹下生成hello.o

 

5.链接过程:

gcc hello.o -o hello

 

6.直接把hello文件拖动到终端即可执行。

 

用g++编译c++源程序

用g++编译c++源程序和c语言类似,可将gcc改为g++逐个尝试。以下只提供一些简单介绍:

-E Preprocess only; do not compile, assemble or link

-S Compile only; do not assemble or link

-c Compile and assemble, but do not link

-o Place the output into

gcc编译c语言程序的更多相关文章

  1. 用gcc编译c语言程序以及其编译过程

    对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!! 1.预编译 --> 2.编译 --> 3.汇编 --> 4.链接- ...

  2. Linux基本使用(1)-使用GCC编译C语言程序

  3. linux终端下 编译c语言程序

    linux终端下,编译C语言程序步骤为: 采用vi进行源代码编写,编写完成后,:wq存盘退出,如: vi test.c 在命令行下,运行gcc编译程序,生成执行码,如: gcc  -o test te ...

  4. 在Linux使用GCC编译C语言共享库

    在Linux使用GCC编译C语言共享库 对任何程序员来说库都是必不可少的.所谓的库是指已经编译好的供你使用的代码.它们常常提供一些通用功能,例如链表和二叉树可以用来保存任何数据,或者是一个特定的功能例 ...

  5. go语言第一问:在其他地方执行编译go语言程序,结果会在哪个地方产生?

    1.我们看执行编译go语言程序中命令,没有找到exe文件.

  6. GCC 编译 Windows API 程序

    前言 这学期学可视化程序设计,要使用 Windows API 绘制界面,由于笔者的笔记本硬盘太小,无法装臃肿的 VS(主要是不想装),也不想用 VC++ 6.0,所以就选用 GCC 来编译. 安装 m ...

  7. Linux编译C语言程序

    1.首先安装gcc包,运行C++程序,安装gcc-c++ 包 如果没有安装的自行进行安装 2.编辑C语言程序, 打印乘法口诀表 [root@Db1 c]# vim chengfa.c 在编辑界面中,输 ...

  8. linux下使用gcc编译运行C程序

    gcc(GNU Compiler Collection)是Linux下最常用的C语言编译器,是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.  在 ...

  9. GCC编译Win图形程序不显示控制台方法

    用VS编译openCV这些有控制台又有图形显示的程序,如果想隐藏控制台,只需要使用一行代码: #pragma comment( linker, "/subsystem:/"wind ...

随机推荐

  1. Eclipse 安装Maven插件m2eclipse

    Eclipse->Help->Install New Software->Work with右边Add按钮->Name字段中输入m2e,Location字段中输入http:// ...

  2. PHP读写Excel

    PHP读写Excel PHP读写Excel可以通过第三方库phpexcel比较优雅地完成,由于PHP对于字符串处理的优势,读写PHP非常方便. 库导入 这里使用composer包管理工具,以下是配置信 ...

  3. 大神们都在用的两个国外的免费离线下载:Rain&amp; LoadBT

    大神们都在用的两个国外的免费离线下载:Rain& LoadBT 最近QQ离线和迅雷离线也都挂了,115还死贵,所以分享两个国外免费的网站.希望可以为大家提供一些帮助,同时也借此机会同大家相互交 ...

  4. Unity3d XmlException: Text node cannot appear in this state的方案

    这个问题是utf-8编码的问题,如果是utf-8+bom那么就会出现这种问题,如果是单纯的utf-8就没有这种问题(当然如果你把他完全变成ansi,那也行) 我在读写xml的时候遇到这个问题.查了好久 ...

  5. Java名称字符串进行星号处理

    /** * 对字符串处理:将指定位置到指定位置的字符以星号代替 * * @param content * 传入的字符串 * @param begin * 开始位置 * @param end * 结束位 ...

  6. C++ 中的不定参数与格式化字符串 # ## vsprintf

    日志打印或者格式字符串时,可能会用到不定参数的使用,这里记录一下. 格式化字符串有很多方法: snprintf std::stringstream # ##的使用 ##是一个连接符号,用于把参数连在一 ...

  7. TCP/IP协议(一)网络基础知识 网络七层协议

    参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...

  8. Github超棒资源汇总

    Awesome List 中文资源大全 经典编程书籍大全 免费的编程中文书籍索引 awesome-awesomeness-zh_CN https://github.com/jnv/lists awes ...

  9. 浪院长 | spark streaming的使用心得

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/rlnLo2pNEfx9c/article/details/82505159 今天.主要想聊聊spar ...

  10. JavaAes加密操作工具类

    package com.king.weixin.util;import java.io.UnsupportedEncodingException;import java.security.Algori ...