GCC知识

像C语言这样的静态语言,运行的步骤是先将C经过编译器转化成汇编语言,汇编语言再经过汇编器转化成机器语言模块,然后链接器将程序的机器语言模块和库程序的机器语言模块和起来,生成可执行文件,最后再由加载器加载这个可执行文件,产生输入输出。

 

在这个环节中,gcc就是扮演着编译器的角色。gcc原本只能编译C语言,但是后来,经过扩展之后也能处理JAVA/OC等语言了。GCC现在已经成为类Unix操作系统的标准编译器了。所以在linux上源码编译软件前大都要先安装gcc。

gcc只是编译器吗?

gcc可以完成从高级语言C变为和执行文件.out的过程。它默认也是有编译链接的功能。gcc有个参数-c 是来控制是否要链接成可执行文件。编译C之后会生成.o的目标文件,链接之后会生成.out的可执行文件。

gcc在这个过程中虽然只是完成编译工作,但是它会调用汇编器(as),链接器(ld)来完成整个代码编译解释过程。

GNU其他工具?

gdb(GNU除错器)也是GNU工程开发出来的调试工具。能对GCC编译链接出来的可执行文件进行定点调试。

gprof(GNU测量器)是测试程序中函数的性能的工具。

g++(C++编译器)和gcc差不多,只是目标语言是c++。

参数

网上的gcc参数的例子很多,比如:http://www.shanghai.ws/gnu/gcc_1.htm。我们直接拿一个例子看一下

比如go/src/make.bash中有一个gcc生成dist的例子:

gcc mflag−O2−Wall−Werror−ggdb−ocmd/dist/dist−Icmd/dist"mflag−O2−Wall−Werror−ggdb−ocmd/dist/dist−Icmd/dist"DEFGOROOT" cmd/dist/*.c

将其中的参数按照上下文转换后如下:

gcc -m64 -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist -DGOROOT_FINAL="$GOROOT_FINAL" cmd/dist/*.c

gcc的参数很多,种类分为几种:

上图参考自http://www.shanghai.ws/gnu/gcc_1.htm

参考文章:http://tigcc.ticalc.org/doc/comopts.html

 

-m64:配置相关选项,代表这个程序的宿主机器cpu架构是amd64

-O2: 优化选项,对程序进行O2级别的优化

-Wall: 警告选项,生成所有警告信息

-Werror: 警告选项,将所有warning当作error处理

-ggdb: 调试选项,编译过程生成调试信息,以便gdb进行调试。

-o: 总体选项,制定生成的可执行文件。如果不指定的话,就默认是xx.out

-I: 目录选项,进行头文件查询的时候被指定的目录也需要进行搜索

-DGOROOT_FINAL="$GOROOT_FINAL" 这个是在预处理过程的时候设置GOROOT_FINAL

最后的cmd/dist/*.c就是源文件了,表示源文件是这个目录下的所有.c文件

时间: 2025-01-20 17:39:38

GCC知识的相关文章

MinGW介绍与使用

3.1:MinGW 是什么?         MinGW 提供了一套简单方便的Windows下的基于GCC 程序开发环境.MinGW 收集了一系列免费的Windows 使用的头文件和库文件:同时整合了GNU ( http://www.gnu.org/ )的工具集,特别是GNU 程序开发工具,如经典gcc, g++, make等.MinGW是完全免费的自由软件,它在Windows平台上模拟了Linux下GCC的开发环境,为C++的跨平台开发提供了良好基础支持,为了在Windows下工作的程序员熟悉

Linux编程环境及gcc基础知识

         Linux系统几个常用的版本本身就带有编译器,因此一般情况在Linux可以直接编译C/C++源代码,它使用的就是著名的gcc.       GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器.它是一套  GNU编译器套装以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划的关键部分,亦是自由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器.                GCC(GNU

GCC调试基础知识

The History of GCC -------------------------------------------------------------------------------- 1984年,Richard Stallman发起了自由软件运动,GNU (Gnu's Not Unix)项目应运而生,3年后,最初版的GCC横空出世,成为第一款可移植.可优化.支持ANSI C的开源C编译器. GCC最初的全名是GNU C Compiler,之后,随着GCC支持的语言越来越多,它的名

[收藏学习]gcc和g++

gcc和g++都是GNU(组织)的一个编译器. 误区一:gcc只能编译c代码,g++只能编译c++代码 两者都可以,但是请注意: 1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的.C++的语法规则更加严谨一些. 2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译

让你的 PHP 7 更快 (GCC PGO)

我们一直致力于提升PHP7的性能,  上个月我们注意到GCC的PGO能在Wordpress上能带来近10%的性能提升,  这个让我们很激动. 然而,  PGO正如名字所说(Profile Guided Optimization 有兴趣的可以Google), 他需要用一些用例来获得反馈, 也就是说这个优化是需要和一个特定的场景绑定的. 你对一个场景的优化, 也许在另外一个场景就事与愿违了.  它不是一个通用的优化. 所以我们不能简单的就包含这些优化, 也无法直接发布PGO编译后的PHP7. 当然,

抽取VS文件组成类GCC的编译器并编译C程序为dll动态链接库

用惯了linux下的GCC编译工具,倒喜欢起命令行的方式编译链接C程序,居然还发现我装的VS工具没看到直接编译C程序的工具(我不太熟悉这个).VS的编译文件命令是cl,链接命令是link.参考了网上资料,采用提取VS的编译器文件组成一个可以命令行方式编译程序的工具.以下为步骤: 1,在自己目录创建文件夹,如:D:/vctool; 2,将VS安装目录下的VC目录下的bin.lib.include目录考到vctool目录下: 3,将c:/Program Files/Microsoft SDKs/Wi

linux下安装或升级GCC 4.8以支持C++11标准

C++11标准在2011年8月份获得一致通过,这是自1998年后C++语言第一次大修订,对C++语言进行了改进和扩充.随后各编译器厂商都各自实现或部分实现了C++中的特性. 如需查看各编译器对C++11的支持程度,请参看文章: 本文主要介绍在Linux系统下,如何升级GCC以支持C++11.目前来看GCC是对C++11支持程度最高最多的编译器,但需要GCC4.8及以上版本. 本文使用操作系统:Centos 6.4 Desktop,64bit: 原GCC版本:4.4.7: 目标:升级GCC到4.8

Python编程入门的一些基本知识

  这篇文章主要介绍了Python编程入门的一些基本知识,包括注释需和Shell命令使用等基本内容,要的朋友可以参考下 Python与Perl,C和Java语言等有许多相似之处.不过,也有语言之间有一些明确的区别.本章的目的是让你迅速学习Python的语法. 第一个Python程序: 交互模式编程: 调用解释器不经过脚本文件作为参数,显示以下提示: ? 1 2 3 4 5 $ python Python 2.6.4 (#1, Nov 11 2014, 13:34:43) [GCC 4.1.2 2

Linux系统中的gdb程序调试工具的命令知识介绍

在Linux系统中有许多的命令程序来辅助系统的正常和方便运行,那么其中在系统中有着一个叫做gdb命令的程序,那么我们今天就来了解下关于gdb命令的知识吧! 一.常规调试 gdb是Linux下常用的程序调试工具,当然前提是用gcc/g++编译时加上-g参数,这样编译出的可执行程序会加上gdb调试信息. gdb命令不少,但常用的主要包括如下命令: (1)list [file:]functuon 命令缩写是l,查看源码,不加参数时,向下显示源码,加参数-l时,向上显示源码,默认显示10行. 也可以设置