gcc入门教程
GCC使用说明

GCC使用手册及常用命令行GCC使用手册作者:Clock1.前言GCC编译器的手册(GCC MANUAL)的英文版已经非常全面,并且结构也非常完善了,只是一直都没有中文的版本,我这次阅读了GCC编译器的主要内容,对手册的内容进行了结构性的了解,认为有必要对这次阅读的内容进行整理,为以后的工作做准备。
由于我对这个英文手册的阅读也仅仅是结构性的。
因此有很多地方并没有看,所以这篇文档的内容我也只能写出部分,对于以后需要详细了解的地方,会再往这篇文档中增添内容,需要增添的内容主要是编译器的各种开关。
2. GCC功能介绍GCC编译器完成从C、C++、objective-C等源文件向运行在特定CPU硬件上的目标代码的转换(这是任何一个编译器需要完成的任务)。
GCC能够处理的源文件分为C、C++、Objective-C、汇编语言等。
对于这些源文件,用他们的后缀名进行标示。
GCC能够处理的后缀有:a. *.c *.C (C语言)b. *.cxx *.cc (C++语言)c. *.m (面向对象的C)d. *.i (预处理后的C语言源文件)e. *.ii (预处理后的C++语言源文件)f. *.s *.S (汇编语言)h. *.h (头文件)目标文件可以是:a. *.o 编译连接后的目标文件b. *.a 库文件编译器把编译生成目标代码的任务分为以下4步:a.预处理,把预处理命令扫描处理完毕;b.编译,把预处理后的结果编译成汇编或者目标模块;c.汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;d.连接,把多个目标代码模块连接生成一个大的目标模块;3. GCC开关GCC的运行开关共分为11类,这是类开关从11个方面控制着GCC程序的运行,以达到特定的编译目的。
3.1. 全局开关(OVERALL OPTIONS)全局开关用来控制在“GCC功能介绍”中的GCC的4个步骤的运行,在缺省的情况下,这4个步骤都是要执行的,但是当给定一些全局开关后,这些步骤就会在某一步停止执行,这产生中间结果,例如可能你只是需要中间生成的预处理的结果或者是汇编文件(比如拟的目的是为了看某个CPU上的汇编语言怎么写)。
GCC快速入门(一)——基础知识

般 的 编 译 器 相 比 ,平 均 执 行 效 率 要 提 高 2 % ~3 %。 0 0 GCC是 GNU 项 目中 ̄ ANS IC标 准 的 编 译
JE P G压 缩 、 压 缩 测 试 , 快 可 解 最
维普资讯
口识 堂 掌
I技 I术 I讲 I座 I I I I
Li u n x下 许 多 编 译 程 序 、连 接 程 序 、工 具 和 图 形 化 的 用 户 界 面 环 境 等 都 由 GCC编 写 的 ,GCC 可 谓 程 序 开 发 的 基 础 编 译 器 。 文 将 分 三 讲 讲 解 如 何 快 速 步 入 GCC大 门 。第 一 讲 主 要 讲 解 与 GCC 本
ቤተ መጻሕፍቲ ባይዱ
器 ,可 以 把 源 代 码 编 译 成 在 其 它 硬件 平 台上 运 行 的 可 执行 代 码 。 用 GCC 编 译 后 生 成 的 代 码 与 一
PG C C ( Pent Um G C C , i
到 的 科 学 计 算 。 准 FO 标 RT RAN 函 数 库 ( 是 FoRTRAN 的 精 这
同 时 , GC C 还 是 一 个 交 叉 编 译
必 备 的一些 基础 知识 。
Auo o f Lb o l 。 它 们 是 tc n 和 it o 等 L n x操 作 系 统 外 层 的 图 形 界 面 iu
Ln x 行 版 本 选 择 i 发 u
在 L n x系 统 下 从 事 应 用 开 iu 发 , 先 应 该 有一 个合 适 的操 作 首 平 台 和 开 发 环 境 , 以选 择 和 安 所
《gcc编译器学习》word版

gcc编译器学习gcc and g++分别是gnu的c&c++编译器gcc/g++在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]4.连接目标代码,生成可执行程序[链接器ld]开始.首先,我们应该知道如何调用编译器。
实际上,这很简单。
我们将从那个著名的第一个C程序开始。
#include stdio.h int main(){printf("Hello World!\n");}把这个文件保存为game.c。
你可以在命令行下编译它:gcc game.c在默认情况下,C编译器将生成一个名为a.out的可执行文件。
你可以键入如下命令运行它:a.out Hello World每一次编译程序时,新的a.out将覆盖原来的程序。
你无法知道是哪个程序创建了a.out。
我们可以通过使用-o编译选项,告诉gcc我们想把可执行文件叫什么名字。
我们将把这个程序叫做game,我们可以使用任何名字,因为C没有Java那样的命名限制。
gcc-o game game.c game Hello World到现在为止,我们离一个有用的程序还差得很远。
如果你觉得沮丧,你可以想一想我们已经编译并运行了一个程序。
因为我们将一点一点为这个程序添加功能,所以我们必须保证让它能够运行。
似乎每个刚开始学编程的程序员都想一下子编一个1000行的程序,然后一次修改所有的错误。
没有人,我是说没有人,能做到这个。
你应该先编一个可以运行的小程序,修改它,然后再次让它运行。
这可以限制你一次修改的错误数量。
另外,你知道刚才做了哪些修改使程序无法运行,因此你知道应该把注意力放在哪里。
这可以防止这样的情况出现:你认为你编写的东西应该能够工作,它也能通过编译,但它就是不能运行。
请切记,能够通过编译的程序并不意味着它是正确的。
gcc的使用方法

gcc的使用方法GCC(GNU Compiler Collection)是一款由GNU开发的编程语言编译器集合,支持多种编程语言,如C、C++、Fortran等。
它被广泛用于各种操作系统和硬件平台上的软件开发,提供了强大的功能和灵活的配置选项。
本文将介绍GCC的基本使用方法,帮助读者快速上手。
一、安装GCC要使用GCC,首先需要在您的计算机上安装它。
GCC可以在多个操作系统上运行,包括Linux、Windows和Mac OS。
具体的安装方法因操作系统而异,下面将分别介绍。
1. 在Linux上安装GCC:在大多数Linux发行版中,GCC已经默认安装。
如果您的系统中没有安装GCC,您可以通过包管理器来安装它。
例如,在Debian或Ubuntu系统上,可以使用以下命令安装GCC:```sudo apt-get install gcc```其他Linux发行版的安装方法请参考相应的文档。
2. 在Windows上安装GCC:在Windows上,可以通过MinGW或MSYS2来安装GCC。
这两个工具集提供了一种在Windows环境中使用GCC的方式。
您可以从官方网站上下载并按照安装向导进行安装。
3. 在Mac OS上安装GCC:在Mac OS上,可以使用Homebrew或MacPorts来安装GCC。
这两个软件包管理系统可以让您以与Linux相似的方式在Mac OS上安装软件。
例如,使用Homebrew安装GCC的命令如下:```brew install gcc```其他安装方法请参考相应文档。
二、编写源代码安装好GCC后,我们就可以开始编写源代码了。
GCC支持多种编程语言,但本文以C语言为例进行介绍。
打开任何文本编辑器,创建一个后缀名为.c的文件,并编写您的C 源代码。
例如,创建一个名为`hello.c`的文件,其中包含以下代码:```c#include <stdio.h>int main() {printf("Hello, world!\n");return 0;}```三、编译和运行代码一旦您编写好了源代码,接下来就可以使用GCC将其编译成可执行文件。
gcc8 编译

GCC (GNU Compiler Collection) 是一个开源的编译器,用于将源代码转换为可执行文件。
GCC 支持多种编程语言,包括 C、C++、Fortran、Ada 等。
如果你想要使用 GCC 8 版本编译你的程序,可以按照以下步骤进行操作:
1. 安装 GCC 8:首先,你需要从官方网站下载并安装 GCC 8。
你可以根据你的操作系统选择适合的安装包。
2. 配置环境变量:安装完成后,确保 GCC 的路径已经添加到系统的环境变量中。
这样,你就可以在任何地方使用 gcc 和 g++ 命令来编译你的程序。
3. 编写源代码:使用你喜欢的文本编辑器编写源代码文件,例如 main.c 或 main.cpp。
4. 编译源代码:打开终端或命令提示符,导航到源代码所在的目录,然后使用 gcc 或 g++ 命令进行编译。
例如:
```bash
gcc main.c -o main
```
或者对于 C++ 文件:
```bash
g++ main.cpp -o main
```
-o main` 表示输出文件名为 main,你可以根据需要更改输出文件名。
5. 运行可执行文件:编译成功后,你可以运行生成的可执行文件。
在终端或命令提示符中输入以下命令:
```bash
./main
```
这将在终端或命令提示符中运行你的程序。
这些是使用 GCC 8 编译程序的简要步骤。
当然,还有其他一些高级选项和功能可供使用,你可以参考 GCC 的文档或手册来了解更多详细信息。
gcc 用法

gcc 用法GCC (GNU Compiler Collection) 是一套自由软件编译器,可以用于编译多种编程语言的源代码,包括 C、C++、Objective-C、Fortran、Ada 和其他一些语言。
GCC 是GNU计划的一部分,由自由软件基金会维护和发展。
本文将详细介绍 GCC 的使用方法。
一、环境准备在使用GCC之前,需要先安装好GCC。
GCC是开源软件,常见的Linux发行版都默认安装GCC,Windows下可以通过安装Cygwin或MinGW等方式安装GCC。
安装完成后,在命令行中输入gcc --version查看gcc的版本号确认是否安装成功。
除了GCC之外,还需要一个文本编辑器来编写源代码。
Windows下常用的文本编辑器有Notepad++,Linux下则使用vim或emacs等编辑器。
还需要了解一些基本的编程知识和语法。
二、GCC 编译 C 语言程序以下是一个简单的 C 语言程序,可以输出 "Hello, world!":```c#include <stdio.h>printf("Hello, world!\n");return 0;}```将上述代码保存为 helloworld.c 文件,然后在命令行中进入文件所在目录,输入以下命令编译该程序:```gcc helloworld.c -o helloworld```gcc是编译器的命令,helloworld.c是待编译的源代码文件名,-o helloworld是生成的可执行文件名。
执行上述命令后,GCC 会把源代码编译成可执行文件 helloworld。
运行该可执行文件,可以得到以下输出:```Hello, world!```三、GCC 编译 C++ 程序GCC 也可以编译 C++ 程序,以下是一个简单的 C++ 程序,可以输出 "Hello,world!":```c++#include <iostream>std::cout << "Hello, world!" << std::endl;return 0;}```将上述代码保存为 helloworld.cpp 文件,然后在命令行中进入文件所在目录,输入以下命令编译该程序:```g++ helloworld.cpp -o helloworld```g++是编译器的命令,helloworld.cpp是待编译的源代码文件名,-o helloworld是生成的可执行文件名。
GCC快速入门(三)——GCC调试和优化技巧

p : 告 诉 GCC 序 里 加 gi  ̄项 程 2 应 用 实 例 . 下 面 通过 一 个 具 体 的实 例 说 明 如 何 利 用 调 试 符 号 来 分 析 错 误 ,所 用 程 序 d b g e u me C如 下 .
入 额 外 的 代 码 ,执 行 时 ,产 生 g r f 的剖 析 信 息 ,以 显示 程 po用 序 的耗 时 情 况 。
G C调试和优化 技巧 C
■ 曾 江 华
G C调 试 常 用 选 项 C
GCC支 持 数 种 调 试 和 剖 析 选 项 , 这 些 选 项里 经 常 会用 到 的 在
是 一g和 P g选 项 。
一
惟 一 的 办法 就是 添 加 大量 的语 句 来产 生 特 定 的输 出 。 GDB的 出 现 减 轻 了 开 发 人 员 的 负 担 ,他 们 可 以在 程 序 运 行 的 时 候 单 步 跟 踪 自 己 的 代 码 ,或 者 通 过 断 点 暂 时 中 止 程 序 的 执 行 ,还 能 够 随 时 察 看 变 量 和 内 存 的 当 前 状 态 ,并 监 视 关 键 的数 据结 构 是如 何 影响 代 码 运行的。 GDB提 供 了 下 列 功 能 : ◆监 视 程 序 中变 量 的值 t ◆设 置 断 点 ,使 程序 在 指 定 的代 码 行上 停 止 执 行 t ◆ 可 以一 行 行地 执 行 代 码 t ◆ 动 态 地 改 变 程 序 的 执 行 环境 。
行 编译 ,同时 产 生调 试符 号 :
# gc -g e  ̄ T e. -0 c d b n C
d b q e e  ̄ n
使 用 G B调 试 程 序 D
1G . DB基 础 G C C 组 件 包 含 了 一 个 叫
linuxgcc命令及用法

linuxgcc命令及用法Linux的gcc命令是一款非常强大的编译器,用于将源代码转换为可执行文件。
本文将详细介绍gcc命令及其常用的用法,帮助读者更好地理解和使用这款工具。
一、gcc命令的基本语法结构gcc是GNU Compiler Collection(GNU编译器集合)的简称,因此其命令基本语法结构一般为:shellgcc [选项] [输入文件]其中,选项用于指定编译时的相关参数,输入文件则是需要编译的源文件。
二、gcc命令的常用选项gcc命令提供了许多选项,用于控制编译过程及生成的可执行文件的属性。
下面是一些常用的gcc选项及其作用:1. -o:用于指定输出文件的名称。
例如,使用`-o myprogram`选项将输出文件命名为myprogram。
2. -c:仅进行编译,不进行链接操作。
这个选项常用于编译多个源文件时,先将每个源文件编译为目标文件,再进行链接操作。
3. -g:生成调试信息。
这个选项会在编译时生成与调试器兼容的调试信息,方便开发人员进行程序调试。
4. -Wall:显示所有警告信息。
使用这个选项可以使编译器在编译时输出更多的警告信息,帮助开发人员提前发现潜在的问题。
5. -I:指定头文件的搜索路径。
使用这个选项可以告诉编译器在指定的路径中查找头文件,方便引用外部库、模块等。
6. -L:指定库文件的搜索路径。
与-I选项类似,这个选项用于告诉编译器在指定的路径中查找库文件,用于链接时的库文件搜索。
7. -l:指定要链接的库文件。
使用这个选项可以显式地告诉编译器要链接的库文件,如:-lmath将链接math库文件。
三、gcc命令的应用实例下面通过几个实例来演示gcc命令的具体用法,以帮助读者更好地理解和掌握这款工具。
1. 编译单个源文件并生成可执行文件假设我们有一个名为`hello.c`的源文件,内容如下:c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}我们可以使用以下命令将其编译为可执行文件`hello`:shellgcc -o hello hello.c编译成功后,即可在当前目录下生成名为`hello`的可执行文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
不经意间,GCC已发展到了4.3的版本,尽管在软件开发社区之外乏人闻问,但因为GCC 在几乎所有开源软件和自由软件中都会用到,因此它的编译性能的涨落会直接影响到Linux 、Firefox 乃至于和Apache等几千个项目的开发。
因此,把GCC摆在开源软件的核心地位是一点也不为过。
另一方面,GCC4.3的出现,正在牵引着广大程序员们的心。
如果我们非要用一个词来说明GCC与程序员之间的关系,那无疑是"心随心动"。
历史篇作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作GCC 的时候,还只是把它当作仅仅一个 C 程序语言的编译器;GCC 的意思也只是GNU C Compiler 而已。
经过了这么多年的发展,GCC 已经不仅仅能支持C 语言;它现在还支持Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的Mercury 语言,等等。
而GCC 也不再单只是GNU C 语言编译器的意思了,而是变成了GNU Compiler Collection 也即是GNU 编译器家族的意思了。
另一方面,说到GCC 对于各种硬件平台的支持,概括起来就是一句话:无所不在。
几乎所有有点实际用途的硬件平台,甚至包括有些不那么有实际用途的硬件平台。
Gcc 简介Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。
Gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
官方网站:/gcc是linux的唯一编译器,没有gcc就没有linux,gcc的重要性就不可言喻啦。
居然这么重要,那就很值得我们来好好研究下啦。
好啦,开始我们的gcc之旅吧!首先消除gcc和g++误区吧。
gcc和g++都是GNU(组织)的一个编译器。
误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,例如:#include <stdio.h>int main(int argc, char* argv[]) {if(argv == 0) return;printString(argv);return;}int printString(char* string) {sprintf(string, "This is a test.\n");}如果按照C的语法规则,OK,没问题,但是,一旦把后缀改为cpp,立刻报三个错:“printString 未定义”;“cannot convert `char**' to `char*”;”return-statement with no value“;分别对应前面红色标注的部分。
可见C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。
误区二:gcc不会定义__cplusplus宏,而g++会实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。
误区三:编译只能用gcc,链接只能用g++严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。
因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。
但在编译阶段,g++会自动调用gcc,二者等价。
误区四:extern "C"与gcc/g++有关系实际上并无关系,无论是gcc还是g++,用extern "c"时,都是以C的命名方式来为symbol 命名,否则,都以c++方式命名。
试验如下:me.h:extern "C" void CppPrintf(void);me.cpp:#include <iostream>#include "me.h"using namespace std;void CppPrintf(void){cout << "Hello\n";}test.cpp:#include <stdlib.h>#include <stdio.h>#include "me.h"int main(void){CppPrintf();return 0;}1. 先给me.h加上extern "C",看用gcc和g++命名有什么不同[root@root G++]# g++ -S me.cpp[root@root G++]# less me.s.globl _Z9CppPrintfv //注意此函数的命名.type CppPrintf, @function[root@root GCC]# gcc -S me.cpp[root@root GCC]# less me.s.globl _Z9CppPrintfv //注意此函数的命名.type CppPrintf, @function完全相同!2. 去掉me.h中extern "C",看用gcc和g++命名有什么不同[root@root GCC]# gcc -S me.cpp[root@root GCC]# less me.s.globl _Z9CppPrintfv //注意此函数的命名.type _Z9CppPrintfv, @function[root@root G++]# g++ -S me.cpp[root@root G++]# less me.s.globl _Z9CppPrintfv //注意此函数的命名.type _Z9CppPrintfv, @function完全相同!【结论】完全相同,可见extern "C"与采用gcc/g++并无关系,以上的试验还间接的印证了前面的说法:在编译阶段,g++是调用gcc的。
二:今天,我们继续gcc之旅吧。
上节我们讲了些gcc的历史发展什么的,还有就是gcc与g++的区别。
今天我们就从整体上对gcc编译过程有个细致的了解,也好明白他的工作原理,好为以后深入学习研究打下个基础。
gcc的编译流程分为四个步骤,分别为:·预处理(Pre-Processing)·编译(Compiling)->hello.i·汇编(Assembling)->hello.s·链接(Linking)以hello.c为例子,在这四个步骤中可以设置选项分别生成hello.i, hello.s, hello.o以及最终的hello文件:hello.c : 最初的源代码文件;hello.i : 经过编译预处理的源代码;hello.s : 汇编处理后的汇编代码;hello.o : 编译后的目标文件,即含有最终编译出的机器码,但它里面所引用的其他文件中函数的内存位置尚未定义。
hello / a.out : 最终的可执行文件(还有.a(静态库文件), .so(动态库文件), .s(汇编源文件)留待以后讨论)下面就具体来查看一下gcc是如何完成四个步骤的。
hello.c源代码#include<stdio.h>int main(){printf("Hello World!\n");return 0;}(1)预处理阶段在该阶段,编译器将上述代码中的stdio.h编译进来,并且用户可以使用gcc的选项”-E”进行查看,该选项的作用是让gcc在预处理结束后停止编译过程。
《深入理解计算机系统》中是这么说的:预处理器(cpp)根据以字符#开头的命令(directives),修改原始的C程序。
如hello.c中#include <stdio.h>指令告诉预处理器读系统头文件stdio.h的内容,并把它直接插入到程序文本中去。
结果就得到另外一个C程序,通常是以.i作为文件扩展名的。
注意:Gcc指令的一般格式为:Gcc [选项] 要编译的文件[选项] [目标文件]其中,目标文件可缺省,Gcc默认生成可执行的文件名为:编译文件.out[gan@localhost gcc]# gcc –E hello.c –o hello.i选项”-o”是指目标文件,”.i”文件为已经过预处理的C原始程序。
以下列出了hello.i文件的部分内容:typedef int (*__gconv_trans_fct) (struct __gconv_step *,struct __gconv_step_data *, void *,__const unsigned char *,__const unsigned char **,__const unsigned char *, unsigned char **,size_t *);…# 2 "hello.c" 2int main(){printf("Hello World!\n");return 0;}由此可见,gcc确实进行了预处理,它把”stdio.h”的内容插入到hello.i文件中。
(2)编译阶段接下来进行的是编译阶段,在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。
用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
汇编语言是非常有用的,它为不同高级语言不同编译器提供了通用的语言。
如:C编译器和Fortran 编译器产生的输出文件用的都是一样的汇编语言。
[gan@localhost gcc]# gcc –S hello.i –o hello.s以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。
.file "hello.c".section .rodata.align 4.LC0:.string "Hello World!".text.globl main.type main, @functionmain:pushl %ebpmovl %esp, %ebpsubl $8, %espandl $-16, %espmovl $0, %eaxaddl $15, %eaxaddl $15, %eaxshrl $4, %eaxsall $4, %eaxsubl %eax, %espsubl $12, %esppushl $.LC0call putsaddl $16, %espmovl $0, %eaxleaveret.size main, .-main.ident "GCC: (GNU) 4.0.0 20050519 (Red Hat 4.0.0-8)".section .note.GNU-stack,"",@progbits(3)汇编阶段汇编阶段是把编译阶段生成的”.s”文件转成目标文件,读者在此可使用选项”-c”就可看到汇编代码已转化为”.o”的二进制目标代码了。