linux gcc编译 结果呢,Linux系统GCC常用命令和GCC编译过程描述

前言:

GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又

扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改

名GNU编译器套件(GNU Compiler Collection)。(百度百科,想了解自己查询)

一.GCC程序的编译过程大概分四个阶段

预处理(Pre-Processing)

编译(Compiling)

汇编(Assembling)

链接(Linking)

二.简单HelloWorld程序的编译过程

示例:HelloWorld.c

#include

int main()

{

printf("Hello World!\n");

return ;

}

Ctrl+Alt+T  --->打开控制台--->输入vim HelloWorld.c

1bf6aa99979179696f11f59fe70d46b0.png

b72f107486734deb963b4563dcd63a9f.png

1. 执行如下命令:$ gcc -o HelloWorld HelloWorld.c

7939a1474a651a85925a35ffac77d6fe.png

运行如下 : $ ./HelloWorld

输出: HelloWorld!

46e119bca05b23a5e8df9cf00a343ac1.png

2. 分步编译如下:

(1) $ gcc –E HelloWorld.c -o HelloWorld.i

可以输出HelloWorld.i文件中存放着HelloWorld.c经预处理之后的代码。打开HelloWorld.i文件,看一看,就明白了。后面那条指令,是直接在命令行窗口中输出预处理后的代码.

gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。在本例中,预处理结果就是将stdio.h 文件中的内容插入到HelloWorld.c中了。

b4ca52183de734d73106b78a1b787b71.png

//预处理结束

//这时候你看一下HelloWorld.i ,可以看到插进去了很多东西。

276092e1300b37d8673bfbdc43ce8b75.png

(2) $ gcc –S HelloWorld.i

gcc的-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o输出汇编代码文件。

24d5c0a410ac8b389df36d8023938325.png

查看下HelloWorld.s //生成汇编代码后结束

21141b5541fe9e5a3988ca0cc0153b82.png

(3)生成汇编代码文件HelloWorld.s以后,需要gas汇编器负责将其编译为目标文件,如下:

$ gcc –c HelloWorld.c

或者:

$ gcc -c HelloWorld.c –o HelloWorld.o

或者:

$ gcc -c HelloWorld.i -o HelloWorld.o

//编译结束

//生成 HelloWorld.o文件

1b10a81b9a04fe3fa881b733c880efc9.png

(4) $ gcc HelloWorld.o –o HelloWorld 生成连接,可执行文件(HellWorld重新生成的可执行文件)

gcc连接器是gas提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。

附加的目标文件包括静态连接库和动态连接库。

对于上一小节中生成的HelloWorld.o,将其与C标准输入输出库进行连接,最终生成程序HelloWorld可执行文件

输入命令:gcc HelloWorld.o –o HelloWorld--->生成如下图:

a847bc5e2abf0999d42b2286d1a5f13e.png

3. 多个程序文件的编译

一般情况一个程序都是有若干个文件源文件组成,所以编译的时候需要形成多个编译单元,使用GCC编译器可以将多个源文件编译成所需要的程序

比如:源文件有main.c     a.c     b.c  最终生成一个可执行的文件main

比如:一个工程有main.c a.c b.c生成test的可执行文件。

编译命令如下:

$ gcc –c main.c a.c b.c –o main

或者:

$ gcc –o main main.c a.c b.c

GCC仍然会按照预处理、编译和链接的过程依次进行

大概过程相当于:

gcc -c main.c -o main.o

gcc -c a.c -o a.o

gcc -c b.c -o b.o

最后:

gcc main.o a.o b.o -o main

Linux 系统巡检常用命令

Linux系统巡检常用命令   # uname -a # 查看内核/操作系统# cat /etc/centos-release # 查看centos操作系统版本# cat /proc/cpuinfo ...

linux系统的常用命令

linux系统中常用的命令如下(以后经常补充): cd ..   返回上一级 cd use  进入use目录

Linux系统之-常用命令及技巧

一. 通用命令:1.date :print or set the system date and time2. stty -a: 可以查看或者打印控制字符(Ctrl-C, Ctrl-D, Ctrl-Z ...

用xshell操作linux系统的常用命令

(1)命令ls——列出文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls a* 列出当前目录下以字母a开头的所有文件 ls -l *.doc 给出当前目录下以. ...

linux系统学习(常用命令)

今天调休,闲来无事,研究一下linux系统. Linux常用命令: 一:文件管理 ctrl+alt:在虚拟机与windows之间切换ctrl+g:进入linux输入模式 pwd:查看当前目录 ls:列 ...

Linux系统巡检常用命令-乾颐堂

Linux系统需要定期巡检,以检查服务器软硬件使用情况,相当于对人的体检,确保可以及时发现问题.解决问题,降低损失,常用的巡检命令如下: # uname -a # 查看内核/操作系统/CPU信息 # ...

Linux系统一些常用命令(持续增加)

这些命令什么的全是从网上找的,防止忘记,留下来备忘 1.linux服务器如何从另一台服务器拷东西:可以用scp命令scp user@remote.machine:/remote/path /local ...

LINUX系统一一常用命令

前言 LINUX UNIX Centos RedHat Ubuntu SHELL shell脚本 shell shell命令 类似windows系统的bat 批处理文件 里面都是脚本 CentOS6. ...

Linux 系统监控常用命令

简介 列举操作系统级监控常用的几个方法,建议收藏使用 CPU top 命令可用于监控系统整体负载,包括cpu.内存使用等,能够实时显示系统中各个进程的资源占用状况 输出样例 top - 19:37:4 ...

随机推荐

js-JavaScript高级程序设计学习笔记9

依然第十三章 事件 1.页面上的所有元素都支持鼠标事件,除了mouseenter和mouseleave,所有鼠标事件都会冒泡. 2.修改键:shift.ctrl.alt.meta.四个属性表示修改键的 ...

js正则表达式 验证手机号,email地址和邮政编码

手机号码的验证(13开头和158,159开头,共11位) var re;        var ss=document.getElementById('textbox3').value;        ...

c# Internet时间服务器同步

2009-02-02 17:48 8226人阅读 评论(2) 收藏 举报 服务器internetc#socketstringwindows 需要用到的名空间 using System.Net; usi ...

Android: Dragging Popup Window 可移动浮动View

final View cv = new View(this); setContentView(cv); TextView tv = new TextView(this); tv.setBackgrou ...

从bug中学习怎么写代码

博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:从bug中学习怎么写代码.

Java实现顺序表

利用顺序存储结构表示的顺序表称为顺序表. 它用一组连续的地址存储单元一次存放线性表中的数据元素. 顺序表的实现是数据结构中最简单的一种. 由于代码中已经有详细注释,代码外不再阐述. 下次再陈上关于顺序 ...

用Bottle开发web程序(一)

Bottle Bottle是一个轻量级的web app框架.相较与django等框架,bottle几乎没有任何依赖,而且只有一个文件.而相对于python默认的SimpleHTTPServer,功能更 ...

openstack私有云布署实践【6 RabbitMQ】

生产环境建议在集群三台controller上做rabbitmq 使用到队列的openstack组件 OpenStack Compute OpenStack Block Storage OpenStac ...

getchar() 、 scanf() 、流与缓冲区

C中的缓冲区一直是debug的重灾区,今天在写一个命令行界面的时候又遇到了这个问题,所以来总结一波. 两函数的不同之处 scanf() 会把 stdinBuff 中的特定格式数据取出,非特定格式数据则 ...

Once More

Topic Link http://ctf5.shiyanbar.com/web/more.php 1)源代码分析 发现 ereg()函数使得password必须是数字或字母同时长度必须是小于8val ...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值