• linux入门到精通-第四章-gcc编译器


    参考

    gcc编译器

    gcc概述

    编辑器vi、记事本)是指我用它来写程序的 (编辑码),而我们写的代码语句,电脑是不懂的,我们需要把它转成电脑能懂的语句,编译器就是这样的转化工具。就是说,我们用编辑器编写程序,由编译器编译后才可以运行!
    编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机器语言的程序。
    gcc (GNU Compiler Collection,GNU 编译器套件是由 GNU 开发的编程语言编译器。gcc原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如linux、BSD、Mac等)采纳为标准的编译器同样适用于微软的Windows。
    gcc最初用于编译C语言,随着项目的发展gcc已经成为了能够编译C、C++、Java、Ada、fortran、Object C、ObjectC++、Go语言的编译器大家族。

    编译命令格式:
    gcc [options] file…
    g++ [options] file…

    • 命令、选项和源文件之间使用空格分隔
    • 一行命令中可以有零个、一个或多个选项
    • 文件名可以包含文件的绝对路径,也可以使用相对路径
    • 如果命令不包含输出可执行文件的文件名,可执行文件的文件名会自动生成一个默认名,Linux平台为a.out,widnow平台为a.exe

    gcc是外部命令

    gcc的工作流程

    gcc编译器从拿到一个c源文件到生成一个可执行程序,中间一共经历了四个步骤:
    在这里插入图片描述

    四个步骤并不是gcc独立完成的,而是在内部调用其他工具,从而完成了整个工作流程:

    在这里插入图片描述

    # 1、进行预处理
    gcc -E hello.c -o hello.i
    # 2、生成汇编文件
    gcc -S hello.i -o hellp.s
    # 3、生成目标代码
    gcc -c hello.s -o hello.o
    # 4、生成可执行文件
    gcc hello.o -o hello
    # 5、执行
    ./hello
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    也可以一步编译完成

    # 将源文件生成一个可执行文件,等价于前面四步
    gcc hello.c -o hello
    # 执行
    ./hello
    
    • 1
    • 2
    • 3
    • 4
    选项作用
    -o file指定生成的输出文件名为file
    -E只进行预处理
    -S(大写)只进行预处理和编译
    -c(小写)只进行预处理、编译和汇编
    -v/–version查看gcc版本号
    -g包含调试信息
    -On n=0~3编译优化,n越大优化得越多
    -Wall提示更多警告信息
    -D编译时定义宏
    # 显示所有的警告信息
    gcc -Wall test.c
    # 将警告信息当做错误处理
    gcc -Wall -Werror test.c
    
    • 1
    • 2
    • 3
    • 4

    -D定义宏用法
    测试程序(-D选项)

    #include 1
    
    int main(void)
    {
    	printf("SIZE: %d n",SIZE);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    执行

    deng@itcast:-/test$ gcc 2test.c -DSIZE=10
    deng@itcast:-/test$ ./a.out
    SIZE: 10
    
    • 1
    • 2
    • 3
  • 相关阅读:
    【Java开发】 Spring 03:云服务器 Docker 环境下安装 MongoDB 并连接 Spring 项目实现简单 CRUD:
    ARM pwn 入门 (2)
    漂亮的bootstrap后台模板
    ISO认证怎么办理,申请流程
    Spring复习面试题
    都说DevOps落地难,到底难在哪里?也许你还没找到套路
    Python 爬虫 AES DES加密反爬
    科研 | 研究成果该如何署名?
    C++ STL之map与unordered_map
    【python海洋专题十六】对大陆周边的数据进行临近插值
  • 原文地址:https://blog.csdn.net/Blueeyedboy521/article/details/131053700