GCC参数详解

gcc是gnu compiler collection 的简称,他包含了多种语言的编译器,如C, C++, Objective-C, Objective-C++, Java, Fortran和Ada。但每种编译器的名字不一样,gcc and g++ 分别是 gnu 的 c & c++ 编译器

gcc/g++ 在执行编译工作的时候,总共需要 4 步

1. 预处理, 生成 .i 的文件 [ 调用预处理器 cpp]

2. 将预处理后的文件转换成汇编语言 , 生成文件 .s[ 调用编译器 gcc/egcs]

3. 有汇编变为目标代码 ( 机器代码 ) 生成 .o 的文件 [ 调用汇编器 as]

4. 连接目标代码 , 生成可执行程序 [ 调用链接器 ld]

常见的gcc参数介绍

-x language filename

   设定文件所使用的语言 , 使后缀名无效 , 对以后的多个有效 . 也就是根

   据约定 C 语言的后缀名称是 .c 的,而 C++ 的后缀名是 .C 或者 .cpp, 如果

   你很个性,决定你的 C 代码文件的后缀名是 .pig 哈哈,那你就要用这

   个参数 , 这个参数对他后面的文件名都起作用,除非到了下一个参数

   的使用。

   可以使用的参数吗有下面的这些

     `c', `objective-c', `c-header', `c++', `cpp-output',

     `assembler', and `assembler-with-cpp'.

   看到英文,应该可以理解的。

   例子用法 :

   gcc -x c hello.pig

-x none filename

  关掉上一个选项,也就是让 gcc 根据文件名后缀,自动识别文件类型

  例子用法 :

   gcc -x c hello.pig -x none hello2.c   

-c

  只激活预处理 , 编译 , 和汇编 , 也就是他只把程序做成 obj 文件

  例子用法 :

   gcc -c hello.c

  他将生成 .o 的 obj 文件

-S

  只激活预处理和编译,就是指把文件编译成为汇编代码。

  例子用法

   gcc -S hello.c

  他将生成 .s 的汇编代码,你可以用文本编辑器察看

-E

  只激活预处理 , 这个不生成文件 , 你需要把它重定向到一个输出文件里

  面 .

  例子用法 :

   gcc -E hello.c > pianoapan.txt

   gcc -E hello.c | more

  慢慢看吧 , 一个 hello word 也要与处理成 800 行的代码

-o

  制定目标名称 , 缺省的时候 ,gcc 编译出来的文件是 a.out, 很难听 , 如果

  你和我有同感,改掉它 , 哈哈

  例子用法

   gcc -o hello.exe hello.c ( 哦 ,windows 用习惯了 )

   gcc -o hello.asm -S hello.c

-pipe

  使用管道代替编译中临时文件 , 在使用非 gnu 汇编工具的时候 , 可能有些问

  题

   gcc -pipe -o hello.exe hello.c

-ansi

  关闭 gnu c 中与 ansi c 不兼容的特性 , 激活 ansi c 的专有特性 ( 包括禁止一

  些 asm inline typeof 关键字 , 以及 UNIX,vax 等预处理宏 ,

-std c99

     表示编译器支持c99标准,主要有c89,c99,gnu89,gnu99,已经c++部分的c++98, c++0x, gnu++98, gnu++0x

-rdynamic

     通知链接器将所有符合添加到动态符号表中去

-lxx

    表示动态加载libxx.so库

-Lxx

    表示增加目录xx,让编译器可以在xx下寻找库文件

-Ixx

   表示增加目录xx,让编译器可以在xx下寻找头文件

优化选项

-o FILE

    生成指定的输出文件。用在生成可执行文件时。

-O0

    不进行优化处理。

-O 或 -O1

    优化生成代码。

-O2

    进一步优化。

-O3

    比 -O2 更进一步优化,包括 inline 函数。

-shared

    生成共享目标文件。通常用在建立共享库时。

-static

    禁止使用共享连接。

-w

    不生成任何警告信息。

-Wall

    生成所有警告信息。一下是具体的选项,可以单独使用

‘-Wcomment’  This option warns about nested comments.

‘-Wformat’   This option warns about the incorrect use of format strings in functions

               such as printf and scanf, where the format specifier does not agree with the  

               type of the corresponding function argument.

‘-Wunused’   This option warns about unused variables.

‘-Wimplicit’ This option warns about any functions that are used without being declared.

‘-Wreturn-type’ This option warns about functions that are defined without a return

                  type but not declared void. It also catches empty return statements in 

                  functions that are not declared void.

 

其他的一些warn编译选项(不包含在Wall中的)

‘-W’     This is a general option similar to ‘-Wall’ which warns about a selection of 

           common programming errors, such as functions which can return without a value 

           (also known as “falling off the end of the function body”), and comparisons

     一般情况下,-W 和 -Wall同时使用

‘-Wconversion’  This option warns about implicit type conversions that could cause

                  unexpected results.

‘-Wshadow’  This option warns about the redeclaration of a variable name in a scope where 

              it has already been declared.

‘-Wcast-qual’  This option warns about pointers that are cast to remove a type qualifier, 

                 such as const.

‘-Wwrite-strings’ This option implicitly gives all string constants defined in the program

                    a const qualifier, causing a compile-time warning if there is an attempt

                    to overwrite them.

‘-Wtraditional’   This option warns about parts of the code which would be interpreted

                    differently by an ANSI/ISO compiler and a “traditional” pre-ANSI 

                    compiler.(5)

上面的这些warn选项都仅仅产生warn,而不会停止编译过程,下面的选项可以将warn视为error并停止编译

‘-Werror’   changes the default behavior by converting warnings into errors, stopping

             the compilation whenever a warning occurs.

      between signed and unsigned values.

 

一般情况下,-W 和 -Wall同时使用

有关宏定义的选项

有两种定义的宏的方式:1:其他原文件中;2:在GCC的命令行中使用 -Dxxx

当这些宏被定义后(#define xxx)

在系统中使用时:#ifdef xxx 就会被预处理器扩展为有效代码;

 

在系统中已经定义了一些系统命名空间内的宏,都是以  __ 开头的 (两条下划线)

使用命令:cpp -dM /dev/null 可以查看到所有的预定义宏

 

(注:在这些宏中,有一些是GCC系统级的宏,它们都不是以__开头,这些非标准的宏可以使用

 GCC的编译选项 -ansi 使其无效)

(其实,利用-Dxxx来定义xxx,就是将xxx赋值为1 )

-Dmacro

  相当于C语言中的#define macro

  

-Umacro

  相当于C语言中的#undef macro

-undef

  取消对所有非标准宏的定义

也是利用 -Dxxx=value的方式来定义

假如利用-DNAME="" (空)来定义一个宏,则这个宏也被视为被定义的,但是如果按值展开的话,

则为空;

-Dmarco=3

     相当于在源文件中的#define macro 3

-g

  只是编译器,在编译的时候,产生调试信息。

-m

  选择不同的硬件型号 或 配置 --- 例如, 68010 还是 68020, 有没有浮点协处理器. 通过指定选项, 安装编译器的一个版本能够为所有的型号或配置进行编译.有很多选项,这里不列举,如 -mshort,认为int类型为16bit

-Xlinker option

  传递option给链接器,如果option有两个参数,我们必须用两次-Xlinker,因为它每次只能传一个字符串。例如-assert definitions,我们需要 -Xlinker -assert -Xlinker definitions。

  如果是GNU的链接器,我们可以这样写 -Xlinker -assert=definitions,而其他链接器可能不支持这样的写法

程序性能测试工具-gprof

To use profiling, the program must be compiled and linked with the ‘-pg’

profiling option:

$ gcc -Wall -c -pg collatz.c

$ gcc -Wall -pg collatz.o

编译和链接的时候添加选项 -pg ,才能使用gprof测试程序性能

然后运行编译通过的程序,才能产生gprof需要的文件 gmon.out(在当前目录下)

然后执行:

$ gprof a.out (假设可执行文件是缺省生成的)

程序覆盖测试工具- gcov

The GNU coverage testing tool gcov analyses the number of times each

line of a program is executed during a run. This makes it possible to

find areas of the code which are not used, or which are not exercised

in testing. When combined with profiling information from gprof the

information from coverage testing allows efforts to speed up a program to

be concentrated on specific lines of the source code.

编译和链接必须使用相关选项,才可以使用gcov工具。

例如:

$ gcc -Wall -fprofile-arcs -ftest-coverage cov.c

其中

‘-ftest-coverage’ adds instructions for counting the number of times

                    individual lines are executed,

‘-fprofile-arcs’ incorporates instrumentation code for each branch of

                   the program. Branch instrumentation records how frequently

                   different paths are taken through‘if’ statements and

                   other conditionals.

运行通过编译的程序,产生供gcov使用的文件:

分别带有后缀:‘.bb’‘.bbg’ and ‘.da’在当前目录下

然后运行

$ gcov cov.c (注意:是源代码文件 )

这样会产生一个带有标注的源文件的副本文件,后缀为 .gcov

在该文件中,标注了每一行代码的执行次数,标注为‘###### ’的语句为

未被执行到的语句。

可以通过命令:

grep ’######’ *.gcov 查找到所有未被执行到的语句

1. 信息是什么?

信息是“位+上下文”。也就是说,信息在计算中如此表达,由多个有序位(BIT)及其值(0或1)组成的整体。

2. 编译系统的大致流程

图表 1 编译系统

1.预编译阶段

输入的是C语言的源文件,通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、 #include和#define命令。该阶段会生成一个中间文件*.i,但实际工作中通常不用专门生成这种文件,因为基本上用不到;若非要生成这种文件不可,可以利用下面的示例命令:

gcc -E test.c -o test.i

2.编译阶段

输入的是中间文件*.i,编译后生成汇编语言文件*.s 。这个阶段对应的GCC命令如下所示:

gcc -S test.i -o test.s

3.汇编阶段

将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示:

gcc -c test.s -o test.o

4.链接阶段

将输入的机器代码文件*.s(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代码文件。这一步骤,可以利用下面的示例命令完成:

gcc test.o -o test

信息的表示和处理

3. 各类型的大小

4. “大小端”(big-edian和little-endian)

endian: The ordering of bytes in a multi-byte number.[3] 

端:在计算机系统体系结构中用来描述在多字节数中各个字节的存储顺序。

图表 2 Mapping registers to memory locations

来源于:

http://www.cnblogs.com/facingwaller/archive/2013/03/18/2966770.html

http://blog.sina.com.cn/s/blog_531bb76301013lyq.html

关于GCC编译的更多相关文章

  1. gcc 编译时 include 搜索路径

    这是一个不复杂的问题:但是网上很多回答都不全面:偶找了一个比较全面的(测试过): 引用http://blog.csdn.net/fjb2080/archive/2010/01/23/5247494.a ...

  2. GCC 编译优化指南(转)

    GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...

  3. GCC编译C代码

    C程序的编译过程       常用文件的后缀名: gcc编译c代码 1.gcc 常用编译选项: 2.gcc编译方法 testc.c: #include <stdio.h> int main ...

  4. CentOS离线安装GCC编译环境

    gcc编译环境rpm下载 安装相关的rpm包,具体版本可能随时间变化而变化,可以去以下地址下载: 重庆大学镜像:http://b.mirrors.lanunion.org/CentOS/中国科学技术大 ...

  5. Linux——【转】gcc编译与gdb调试简要步骤

    原文:gcc编译与gdb调试简要步骤 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定义和include文件展开等工作:(.i) l 根据编译参数进行不同程 ...

  6. gcc编译的四个阶段:预处理,编译,汇编,链接

    1:gcc编译的四个阶段:预处理,编译,汇编,链接 #vi file.c #gcc -E file.c -o file.i//-E查看且预处理后停止编译,-o生成目标文件,-i表示已预处理 #gcc  ...

  7. gcc编译与gdb调试简要步骤

    http://blog.chinaunix.net/uid-24103300-id-108248.html 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定 ...

  8. gcc编译时对'xxxx'未定义的引用问题

    gcc编译时对’xxxx’未定义的引用问题 gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没 ...

  9. Linux gcc 编译日记

    gcc 编译器是众多编译器组合入口,例如在编译 .cpp 文件时,使用c++ 编译器,编译.c 文件时,使用c编译器. 在编译c++程序时, 库文件与头文件可通过 -L[dir] 指定库目录 , -l ...

  10. C++常见gcc编译链接错误解决方法

    除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词): 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdy ...

随机推荐

  1. 修改git仓库的远程地址

    在我们开发的过程中,代码一般是由 git 来管理的,但有些时候我们的 git 仓库的地址可能发生了变换,比如我们使用的 gitLab 地址发生了变化,那么这个时候如何来将原项目的 git 地址进行修改 ...

  2. mongodb的聚合操作

    在mongodb中有时候我们需要对数据进行分析操作,比如一些统计操作,这个时候简单的查询操作(find)就搞不定这些需求,因此就需要使用  聚合框架(aggregation) 来完成.在mongodb ...

  3. Noip模拟35 2021.8.10

    考试题目变成四道了,貌似确实根本改不完... 不过给了两个小时颓废时间确实很爽(芜湖--) 但是前几天三道题改着不是很费劲的时候为什么不给放松时间, 非要在改不完题的时候颓?? 算了算了不碎碎念了.. ...

  4. AVL树的插入和删除

    一.AVL 树 在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为 1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度 ...

  5. linux cut

    参考:Linux cut 命令详解_Linux_脚本之家 (jb51.net) 参考:cut命令_Linux cut 命令用法详解:连接文件并打印到标准输出设备上 (linuxde.net)

  6. Memory Analyzer Tool 使用

    转载出处:https://wensong.iteye.com/blog/1986449 最近一段时间一直在研究热部署,热部署中涉及到一个比较头痛的问题就是查内存泄露(Memory Leak),于是乎在 ...

  7. 新手使用python以及pycharm看过来

    前言 随着互联网时代的进步,人类与计算机之前的沟通交流越来越便捷,自此交流的媒介--编程语言吸引力更多的人学习,今天我们就来谈谈当前市面上最火的编程语言 1.文件的概念 什么是文件夹.文件 其实是操作 ...

  8. PTA 列车调度 (25分)

    PTA 列车调度 (25分) [程序实现] #include<bits/stdc++.h> using namespace std; int main(){ int num,n; cin& ...

  9. Python | Python常用函数、方法示例总结(API)

    目录 前言 1. 运算相关 2. Sring与数字 3. 列表相关 4. 集合相关 5. 序列化类型 6. 字典相关 7. 输入输出 8. 文件相关 9. json模块 10. unittest测试模 ...

  10. R数据分析:生存分析与有竞争事件的生存分析的做法和解释

    今天被粉丝发的文章给难住了,又偷偷去学习了一下竞争风险模型,想起之前写的关于竞争风险模型的做法,真的都是皮毛哟,大家见笑了.想着就顺便把所有的生存分析的知识和R语言的做法和论文报告方法都给大家梳理一遍 ...