Linux C编程 GCC的使用
本篇文章面向一些会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放在可执行文件的适当位置上,该程序引用的函数也放在可执行文件中。
- Linux的可执行文件并没有像 Windows 那样有明显的.exe后缀名, 只需向其分配x(可执行)权限即可
sudo
chmod u+x excutefile
- Linux的可执行文件并没有像 Windows 那样有明显的.exe后缀名, 只需向其分配x(可执行)权限即可
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的使用的更多相关文章
- storysnail的Linux串口编程笔记
storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- linux网络编程_1
本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- Linux网络编程10——使用UDP实现五子棋对战
思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct t ...
- Linux多线程编程和Linux 2.6下的NPTL
Linux多线程编程和Linux 2.6下的NPTL 在Linux 上,从内核角度而言,基本没有什么线程和进程的区别--大家都是进程.一个进程的多个线程只是多个特殊的进程他们虽然有各自的进程描述结构, ...
- 【转】Linux网络编程入门
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- Linux多线程编程小结
Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序 ...
随机推荐
- hdu 3657 最小割(牛逼!!!!)总算理解了
<strong></strong> 转载:http://blog.csdn.net/me4546/article/details/6662959 加颜色的太棒了!!! 在网上看 ...
- POJ3669 Meteor Shower
http://poj.org/problem?id=3669 类似于迷宫的一道题 但是并没有 给出迷宫具体什么样 但是题目已说在坐标轴的第一象限 然后障碍就是 流星雨所砸范围 安全位置:永远不会发生危 ...
- php框架之自动加载与统一入口
现在PHP有很多的框架,基本都是以MVC为基础进行设计的.其实很多框架(像thinkphp,zf,symfont等)都有两个特性,自动加载类文件和统一入口.这里就简单实现以上两个特性. 假设PHP使用 ...
- 2018/2/20 Springretry,Feign,以及用通俗的语言(自认为)教会你关于Hystrix的复杂概念
本来想昨天写的,但临时有事.弄的一晚上都没睡觉,现在头好晕,所以此笔记如果有语言措辞的组织不当,还请见谅:最后,本文可能涉及到大量专业名词,我会尽量用通俗的语句去阐述清楚它们的意思,但如果还是没看懂, ...
- 解决json_encode中文乱码
在使用json_encode之前把字符用函数urlencode()处理一下,然后再json_encode,输出结果的时候在用函数urldecode()转回来
- POJ 2411_Mondriaan's Dream
题意: 用1*2和2*1的方块将给定长宽的矩形填满.问有多少种放法,对称的算两种. 分析: 状态压缩dp 首先用0表示前一行没有竖块占用这个位置,而1表示该位置和他上方的位置放了一个竖块,从而压缩状态 ...
- 深入理解hadoop(二)
hadoop RPC 网络通信是hadoop的核心模块之一,他支撑了整个Hadoop的上层分布式应用(HBASE.HDFS.MapReduce), Hadoop RPC具有以下几个特性,透明性(用户本 ...
- 在 IIS 中承载 WCF 服务
本主题概述了创建 Internet 信息服务 (IIS) 中承载的 Windows Communication Foundation (WCF) 服务所需的基本步骤. 本主题假设您熟悉 IIS 且了解 ...
- Android GIS开发系列-- 入门季(14)FeatureLayer之范围查询
Android GIS开发系列-- 入门季(5),这篇文章中,我们知道如何去查找要素.现在有一个需求,查找某点5000米范围的要素,那如何来做呢?首先我们需要在地图上画个5000米半径的圆,然后根据Q ...
- hbase definitive guide 笔记
ext3 file system 优化 ext3 在用在hbase上可以做如下优化: 1. mount的时候加上noatime选项.这可以减少管理开销 2. 用命令tune2fs -m 0 /dev/ ...