GCC 编译

GCC的编译流程分为四个步骤,分别为:

  • 预处理(Pre-Processing)

    • 可以通过gcc -E hello.cc -o hello.i查看中间结果
  • 编译(Compiling)
  • 汇编(Assembling)
  • 链接(Linking)

gcc 命令只能编译C++源文件,而不能自动和C++程序使用的库链接。因此,通常使用g++命令来完成C++程序的编译和链接,该程序会自动调用gcc实现编译

1. 总体选项

  1. -c:只激活预处理、编译和汇编过程,但不做link,只生成目标文件
  2. -o:指定输出文件,未指定时,默认为a.out
  3. -S:只激活预处理和编译,生成.s的汇编文件
  4. -E:只激活预处理,需要重定向到一个文件里,gcc -E hello.c > pre_hello.i

2. 调试选项

  1. -g:以操作系统的本地格式(stabs, COFF, XCOFF等)产生调试信息,以便GDB使用
  2. -glevel:调试信息生成级别,默认为2,如-g3
    • level=1,输出少量调试信息,没有局部变量和行号信息
    • level=3,输出较多调试信息

3. 预处理器选项

  1. -Dmacro:相当于C语言中的#define macro
  2. -Dmaroc=defn:定义宏macro的内容为defn,相当于C语言中#define marco=defn
  3. -Umacro:取消宏macro,-U 选项在所有-D 选项之后使用
  4. -include file:当某个文件需要另一个文件时,可以用它来设定,功能类似#include <filename>,如gcc hello.c -include /root/ss.h

4. 链接器选项

  1. -static:将禁止使用动态库
  2. -shared:指定生成一个共享目标文件,常搭配-fPIC使用
  3. -Wl,option:把选项option传递给链接器;如果option包含逗号,会分隔为多个选项
  4. -symbolic:建立共享目标文件时候,把引用绑定到全局符号上

5. 目录选项

  1. -l{library]}:指定编译的时候使用的库,如gcc -lcurses hello.c,链接时使用
  2. -L{dir}:指定编译时,搜索库的路径。如果不指定,编译器将只在标准库的目录搜索
  3. -I{dir}:增加编译时,搜索头文件的路径。 当使用#include "file"时,gcc/g++会先在当前目录查找你指定的文件,若没有,则去缺省的头文件目录找。若使用-I指定了目录,则会优先在指定的目录找,再按照常规顺序寻找。对于#include <file>gcc/g++会到-I指定目录找,若没有,则去缺省的头文件目录找。
  4. -I-:取消前一个-I{dir}的参数功能
  5. -nostdinc:告诉编译器不在系统缺省的头文件目录里找头文件,一般与-I联合使用
  6. -nostdinc++:告诉编译器不在g++指定的标准路径中搜索,但仍在其他路径搜索,此选项在创建libg++库使用

6. 警告选项

  1. -w:禁止所有警告信息(不建议)
  2. -Wall:开启大部分警告提示(建议使用)
  3. -Werror:视警告为错误,出现任何警告立即中断编译

7. 优化选项

  1. -O0:不优化
  2. -O1:优化,对于大函数,优化编译占用稍微多的时间和相当大的内存
  3. -O2:更多优化,除了空间和速度交换的优化选项,执行几乎所有的优化
    • 如:进行循环展开和函数内联
    • 会增加编译时间,但提高了生成代码的执行效率
  4. -ffloat-store:不要在寄存器中存放浮点变量

8. 代码生成选项

  1. -fpic:如果支持这种目标机,编译器就生成位置无关目标码,适用与共享库
  2. -fPIC:如果支持这种目标机,编译器就生成位置无关目标码,即使分支需要大范围转移

9. 语言选项

  1. -std=c++11:支持c++11
  2. -ansi:支持符合ANSI标准的C程序
  3. -fno-asm:用于诗词安anis选项中功能的一部分,禁止将asminlinetypeof用作关键字
  4. -x language filename:设定此文件使用的语言,无视后缀名,且对此参数后多个文件有效,如gcc -x c hello.pig -x none,指定none来关闭上一个选项

10. 机器相关选项

  1. -mhard-float:输出包括浮点指令的目标码,缺省选项

  2. -msoft-float:警告:没有为SPARC提供GNU浮点库.一般说来使用该机型本地C编译器的相应部件

    • 不能直接用于交叉编译.你必须自己安排,提供用于交叉编译的库函数.
    • -msoft-float 改变了输出文件中的调用约定;因此只有用这个选项编译整个程序才有意义

GCC编译选项含义解析的更多相关文章

  1. 2015-08-26: GCC编译选项(转载)

    gcc提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告:           -Waddress -Warray-bounds (only with -O2) ...

  2. GCC 编译选项

    http://www.cnblogs.com/xmphoenix/archive/2011/03/21/1989944.html GCC 编译选项(转) gcc提供了大量的警告选项,对代码中可能存在的 ...

  3. 用于阻止缓冲区溢出攻击的 Linux 内核参数与 gcc 编译选项

    先来看看基于 Red Hat 与 Fedora 衍生版(例如 CentOS)系统用于阻止栈溢出攻击的内核参数,主要包含两项: kernel.exec-shield 可执行栈保护,字面含义比较“绕”, ...

  4. GCC编译选项

    一.看例子分析gcc 的编译选项 gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld 1.-I /home/h ...

  5. iReport默认参数和变量的含义解析【转】

    iReport默认参数和变量的含义解析[转] http://uule.iteye.com/blog/775338 参考:http://blog.csdn.net/terryzero/article/d ...

  6. gcc编译选项汇集

    gcc -g 调试选项(DEBUGGING OPTION)GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错: -g 以操作系统的本地格式(stabs, COFF, XCOFF,或 ...

  7. 【ABAP系列】SAP ABAP SY-SUBRC的含义解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP SY-SUBR ...

  8. (转载)gcc编译选项总结

    转载自:https://blog.csdn.net/gatieme/article/details/21389603 常用编译选项 gcc and g++分别是gnu的c & c++编译器 g ...

  9. (GCC) gcc 编译选项 -fno-omit-frame-pointer,-fno-tree-vectorize,fno-optimize-sibling-calls;及内存泄漏、非法访问检测 ASAN

    omit-frame-pointer 开启该选项,主要是用于去掉所有函数SFP(Stack Frame Pointer)的,即在函数调用时不保存栈帧指针SFP,代价是不能通过backtrace进行调试 ...

  10. GCC 编译选项(转)

    转:http://www.cnblogs.com/xmphoenix/archive/2011/03/21/1989944.html gcc提供了大量的警告选项,对代码中可能存在的问题提出警 告,通常 ...

随机推荐

  1. 不到2000字,轻松带你搞懂STM32中GPIO的8种工作模式

    大家好,我是知微! 学习过单片机的小伙伴对GPIO肯定不陌生,GPIO (general purpose input output)是通用输入输出端口的简称,通俗来讲就是单片机上的引脚. 在STM32 ...

  2. #KM算法#UVA11383 Golden Tiger Claw

    题目 给定 \(n*n\) 的矩阵,现在给每行安排一个权值 \(x_i\),给每列安排一个权值 \(y_j\), 使得 \(x_i+y_j\geq a_{i,j}\),并且使 \(\sum_{i=1} ...

  3. #斜率优化,二分#CF631E Product Sum

    题目 有一个数列 \(a\),其权值为 \(\sum_{i=1}^ni*a_i\), 现在可以任意选择其中一个数字扔到任意位置,使权值和最大. \(n\leq 2*10^5,|a_i|\leq 10^ ...

  4. Numpy数组拼接和分裂

    将多个数组合并成一个,或将一个数组分裂成多个. 数组拼接 concatenate([a1, a2, ...], axis=0, out=None) #默认沿axis = 0轴拼接,也可设置沿axis ...

  5. sqli_lab Less1练习笔记

    首先观察页面信息,看有没有提示. 很显然,这个页面让我们传入id这个参数(根据题目的分支,应该是get方法) 使用HackBar进行传入参数,首先传入id=1 http://localhost/sql ...

  6. HDC2021技术分论坛:广发证券携手HarmonyOS打造智慧金融服务

    以下文章来源于广发证券科技金融 ,作者GFS 本期我们给大家带来的是广发证券前端开发工程师黄钦佳的分享,希望能给你的HarmonyOS开发之旅带来启发~ 10月22日,华为开发者大会2021(Toge ...

  7. 重新点亮linux 基本软件————防火墙[一]

    前言 简单介绍一下linux的防火墙. 正文 防火墙分类: 软件防火墙和硬件防火墙 包过:过滤防火墙和应用层防火墙 iptables 的表和链 规则表: filter nat mangle raw f ...

  8. C++ 默认参数与引用传递:语法、用法及示例

    C++ 默认参数 默认参数概述 在 C++ 中,函数参数可以拥有默认值.这意味着,在调用函数时,如果省略了某个参数,那么将使用为该参数指定的默认值. 设置默认参数 默认参数值使用等号 = 符号进行设置 ...

  9. react 框架(antd)的使用方法

    脚手架 安装    npm install -g create-react-app 引入: import React, { Component } from "react"; im ...

  10. D365调试进入系统类方法

    在生成InventDIMID时,虽然设置了InventDIMID的Number sequence为自定义的Format,但是总是不按指定的Number sequence产生InventDIMID Di ...