本篇文章面向一些会linux文件操作与vim基本命令,编程大佬请移步勿喷。

gcc是默认安装的,但是其还缺少常用的头文件和库文件,所以还需要build-essential这个包,可以在联网状态下使用如下命令

$sudo apt-get install build-essential

(apt-get是Ubuntu下的软件管理命令,它可以安装、删除、更新系统中的软件包)

安装完成后,可以使用gcc -v命令查看gcc的版本号。

一、编译器gcc的使用

1.gcc支持的一些源文件后缀名

后缀 源文件
.c C语言源文件
.C .cc .cxx C++源文件
.m Object-C源文件
.i 经过预处理后的C源文件
.ii 经过预处理后的C++源文件
.s .S 汇编语言源文件
.h 预处理文件(头文件)
.o 目标文件
.a 存档文件

2.gcc编译程序的流程

源文件(.c)——>预处理(.i)——>编译——>汇编(.s)——>链接——>可执行文件

(filename.c)  (预处理器)    (编译器) (汇编器)       (连接器)   (excutefile)

(1)预处理,这是C语言的第一阶段,此时gcc需要对C语言源文件中包含的各种头文件和宏定义进行处理,如#define,#include,#if等(文件名后缀为  .i)

(2)编译,这个过程gcc根据输入的C语言源文件来产生汇编语言,由于通常是立即调用汇编程序,所以其输出一般不保存在文件中。在编译步骤中gcc首先检查代码的规范性、是否存在语法错误等,以确定代码的功能,然后将C语言代码翻译成汇编语言代码。(文件名后缀为 .s)

(3)汇编,gcc将刚得到的汇编语言用于输入,产生具有 .o扩展名的目标文件。

(4)链接,在本阶段中各目标文件被gcc放在可执行文件的适当位置上,该程序引用的函数也放在可执行文件中。

    1. Linux的可执行文件并没有像 Windows 那样有明显的.exe后缀名, 只需向其分配x(可执行)权限即可 sudo
      chmod u+x excutefile

3、gcc常用选项说明

选项 说明
-c 仅对源文件进行编译,不链接生成可执行文件。

在对目标文件查错或只产生目标文件时可使用该选项
-o filename 将经过gcc处理过的结果保存为filename,这个结果可以是预处理文件、汇编文件、

目标文件、或者是最终的可执行文件。
-g or -gdb 在可执行文件中加入调试信息,方便程序的调试。如果使用"-gdb"选项,表示加入gdb扩展的调试信息,

以便gdb来进行调试。
   

4.用gcc编译一个C程序

// filename: hello.c
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Hello");
}

上述文件保存为hello.c文件

ps:gcc hello.c -o hello -------第二个hello为文件名,名字任取

一个简单的-o选项可以省略很多中间步骤,一i次性输出可执行文件,但是从编译的角度来看,这条命令背后是一系列繁杂的工作。

5.gcc具体原理

第一步:

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

得到一个预处理器处理后的C源文件,可以用vim打开看看

-E参数可以使gcc在预处理完成后结束编译

第二步:

$ gcc -c hello.i -o hello.o

进行编译过程

请记住,gcc预处理源文件的时候,不会进行语法错误的检查;

语法错误会在第二步进行,比如花括号不匹配、行末尾没有分号、关键字错误。

第三步:

gcc将目标文件链接为一个可执行文件,一个大致的编译流程结束。

gcc hello.o -o hello

Linux C编程 GCC的使用的更多相关文章

  1. storysnail的Linux串口编程笔记

    storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...

  2. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  3. linux网络编程_1

    本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...

  4. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  5. [转] - Linux网络编程 -- 网络知识介绍

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  6. Linux网络编程10——使用UDP实现五子棋对战

    思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct t ...

  7. Linux多线程编程和Linux 2.6下的NPTL

    Linux多线程编程和Linux 2.6下的NPTL 在Linux 上,从内核角度而言,基本没有什么线程和进程的区别--大家都是进程.一个进程的多个线程只是多个特殊的进程他们虽然有各自的进程描述结构, ...

  8. 【转】Linux网络编程入门

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  9. Linux多线程编程小结

     Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序 ...

随机推荐

  1. Linux下汇编语言学习笔记66 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  2. HDU 5643 King's Game 【约瑟夫环】

    题意: 变形的约瑟夫环,最初为每个人编号1到n,第i次删去报号为i的人,然后从它的下一个人开始重新从1开始报号,问最终剩下第几号人? 分析: 首先看一下裸的约瑟夫环问题: 共n个人,从1开始报数,报到 ...

  3. 本地配置nginx的https

    前文:因为要用谷歌下的getUserMedia方法,而getUserMedia方法只能在https下才能调用,所以在本地搭建https来测试,现在说说步骤. 步骤1:下载nginx-1.10.3.zi ...

  4. Ubuntu 16.04安装Atom(加强版文本工具)

    安装: sudo add-apt-repository ppa:webupd8team/atom sudo apt-get update sudo apt-get install atom 或者直接上 ...

  5. spark开发环境配置

    以后spark,mapreduce,mpi可能三者集于同一平台,各自的侧重点有所不用,相当于云计算与高性能计算的集合,互补,把spark的基础看了看,现在把开发环境看看,主要是看源码,最近Apache ...

  6. laravel有用的方法

    1.tinker 造假数据 factory('App\User',3)->create(); DB::table 返回collection,可以用collection中的很多方法 比如-> ...

  7. react 项目实战(八)图书管理与自动完成

    图书管理 src / pages / BookAdd.js   // 图书添加页 /** * 图书添加页面 */ import React from 'react'; // 布局组件 import H ...

  8. Objective-C 2.0 基础要点归纳

    本文的阅读基本条件: 具备C/C++基础知识,了解面向对象特征 阅读过<Objective-C 2.0 程序设计(第二版)>.<Objective-C 程序设计 第6版>或相关 ...

  9. js中的封装、继承、多态

    Javascript是一门解释型的语言,是基于对象的,并不是真正的面向对象的语言,对变量类型的应用也是宽松的,其实它同样可以模拟面向对象的功能:  1 function myfun1(){  2    ...

  10. redux 调试工具

    首先安装谷歌插件: redux-devtools 然后项目中安装插件:redux-devtools-extension 最后在创建 store 的时候进行配置: import { composeWit ...