zoukankan      html  css  js  c++  java
  • 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 -o cmd/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的参数很多,种类分为几种:

    Image(2)

    上图参考自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文件

    参考文章:

    http://blog.studygolang.com/116.html

    http://www.shanghai.ws/gnu/gcc_1.htm

    http://tigcc.ticalc.org/doc/comopts.html

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    I2C驱动程序
    3.4.2内核下的I2C驱动
    ARM Linux bootloader笔记
    将博客搬至CSDN
    《淘宝技术这十年》读后感
    《华为研发》2读后感
    《大数据》涂子沛【3.0升级版】读后感
    Cadence画封装的步骤
    Cadence PCB层的概念
    fPLL结构及动态配置
  • 原文地址:https://www.cnblogs.com/yjf512/p/2863903.html
Copyright © 2011-2022 走看看