本文是《An introduction to GCC》的学习笔记,记录使用GCC/G++主要的实用技巧,本文讲述的知识基本上摘自本书,附带自己的一些体验。如果想详细查看本书,请戳这里

一、gcc

1. 命令 $ gcc test.c -o test

  将test.c 命令编译成test可执行程序。-o 命令制定输出文件名。

  没有任何其他的参数即默认编译成可执行程序,输入命令 $ ./test 即可执行。gcc 实际上是分成四步:预处理、编译、汇编、链接。

  •    $ gcc -E hello.c -o hello.i    只执行预处理
  •    $ gcc -S hello.c -o hello.s   执行预处理和编译
  •    $ gcc -c hello.c -o hello.o   执行预处理、编译、连接
  •    $ gcc hello -o hello         执行四个步骤,得到excutable file

  关于这四步的详细解释先给出这些,有大个体的认识,如果想详细了解,请往下看,或者阅读《An introduction to GCC》

2. 如果有错误

  如果程序出现错误,gcc则会停止编译,不会最终生成文件,并提示错误信息。错误信息提示按如下格式:

    filename: line-number : error message 。

  编译器区分报错信息和警告信息,不能成功编译的是报错信息,指示可能的错误的是警告(但并不停止程序的编译,如果希望警告则停止也有方法,使用-Werror编译选项即可)。

  通过提示的编译错误提示可以较为方便的找到错误。

3. 如果希望编译多个文件

  如果希望编译多个文件,只要程序布局正确,也很简单,直接罗列出所有的.c文件,最后生成可执行文件即可。.h 头文件不用显示写出,因为在编译.c文件的时候会自动编译关联的.h文件。如:

  $ gcc file1.c file2.c -o file。

  如果程序很大,包含多个源文件,但是只修改了其中的一个或两个文件怎么办?难道需要重新编译所有的吗?如果源程序很大时,这么做是非常低效的。因此,一个方法是采用分步独立编译的方法。参考上面说明的四步编译,

  1. 先把各个源文件编译分别成目标文件
  2. 再将目标文件进行链接成可执行文件
  3. 当修改其中一部分源文件时,只需要将修改过的源文件编译成目标文件
  4. 再将所有的目标文件链接成可执行文件即可。

但是,这样其实也非常低效,make 命令很好的解决这个问题。虽然make非常强大,在编写大型软件时强烈建议使用make,但make不在本文的讨论范围。

二、编译选项(重点)

  对于gcc使用者来说,最终要的就是这些编译选项了。编译选项非常多,这里只总结较为经常使用的一些命令。

  •   -o        指定生成的可执行文件的名字(常用,不用例子了吧)
  •     -Dmacro    定义指定的宏,使他能够通过源码中的 #ifdef 进行检验(不常用,就不举例了,详细请阅读《gccintro》)
  •     -LDIRNAME    将DIRNAME(路径名) 加入到库文件搜索的路径中
  •     -g        在可执行文件中包含标准调试信息(用gdb调试时经常使用,重要
  • -lDIRNAME    将DIRNAME(路径名)加入到头文件搜索路径中
  •   -llibrary     提示连接程序在创建最终可执行文件时包含指定的库(不熟悉)
  •     -O, -O2, -O3  将优化状态打开,该选项不能与-g选项联合使用
  •     -E, -S, -c   管理编译过程。
  •     -Wall       打开所有最常用到的编译警告,即如果程序中有警告,则提示。(重要,有时候能避免错误,因此强烈建议每次使用时都加上。
  •     -Werror     发生警报时停止编译操作
  •     -w       禁止所有警报
  •     -static      对库文件进行静态连接
  •     -ggdb      在可执行文件中包含只有gdb才能识别的大量调试信息

三、预处理

1. 预处理: 展开源文件中的宏。(宏就不解释了)

2. 宏定义

  有三种方法可以定义宏:

  • 在源程序中利用 # define MAX 100 的方式
  • 在gcc命令中利用选项 -Dmacro ,macro即为宏如:
// macro.c
#include <stdio.h>
int main (void)
{
#ifdef TEST
printf ("Test mode\n");
#endif
printf ("Running...\n");
return ;
}

  执行命令:$ gcc -Wall -DTEST macro.c -o macro,得到的结果是: Test mode

  • 有些宏是由编译器自动定义的----这些宏会用到由双下划线(__)开始的保留的名字空间。

3. 预处理源文件

  命令选项: -E。这个选项将源文件(.c)预处理为 .i 结尾的文件。

// test.c
# define TEST "hello world"
const char str[] = TEST

  利用命令 $ gcc -E test.c -o test.i ,执行后得到 test.i 即为预处理后的文件。

// test.i
# define TEST "hello world"
const char str[] = "hello world"

  从上面两个文件对比,可以看到,已经进行了宏替换

四、带调试信息选项

1. 如果需要调试,使用gdb工具,不过在使用前必须在使用-g选项

2. 使用core文件获取错误信息。不常用,详细阅读**

五、编译优化(暂略)

六、编译相关工具

1. 用 GNU 归档工具 ar 创建静态库
2. 使用性能剖析器 gprof
  GNU 性能剖析器 gprof 是衡量程序性能的有用工具----它记录每个函数调用的次数和每个函数每次调用所花的时间。函数在运行期所花费的大部分时间可以很容易地由 gprof 标识出来。加速程序运行的努力应该首先被放在那些在总体运行时间中“称王称霸”的函数。

  为了剖析性能,该程序必须带“-pg”选项来编译和链接:
  $ gcc –Wall –c –pg collatz.c
  $ gcc –Wall –pg collatz.o
这就生成了一个会产生剖析数据的可执行文件,其包含有记录每个函数所花时间的额外指令。如果程序有多个源代码文件,则编译每个源文件时都要带上“-pg”选项,同样在把多个对象文件链接以生成最后的可执行文件时也要如法炮制(象上面展示的) 。忘记在链接时带“-pg”选项常见错误,在剖析性能时不会生成任何有用的信息。可执行文件只有通过运行才能生成剖析数据:
  $ ./a.out
  (显示程序的正常输出)
  运行生成的可测量的可执行文件后,剖析数据被悄无声息地记录到当前目录下的“gmon.out”文件中。以可执行文件名作为参数运行 gprof 就可以分析这些数据:
  $ gprof $ ./a.out
  (显示程序的各函数耗费时间)
3. 用 gcov 进行代码覆盖测试(貌似很好使)
  GNU 代码覆盖测试工具 gcov 分析在程序运行期间每一行代码执行的次数。这就使找到没有被用到的代码区域或没有被测试到的代码成为可能。
七、编译过程
1. 预处理:将宏定义展开

2. 编译:从源代码到适合处理器兼容的汇编代码

3. 汇编:将汇编程序编译成目标代码(机器码)

4. 链接:将生成的目标代码利用ld工具连接成一个可执行文件

八、G++

  G++ 和 GCC的使用情况大致一样,不再特别说明。

作者:viczzx 出处:http://www.cnblogs.com/zixuan-zhang 欢迎转载,也请保留这段声明。谢谢!

GCC/G++ 学习笔记的更多相关文章

  1. CC/G++ 学习笔记

    CC/G++ 学习笔记 本文是<An introduction to GCC>的学习笔记,记录使用GCC/G++主要的实用技巧,本文讲述的知识基本上摘自本书,附带自己的一些体验.如果想详细 ...

  2. g++ 学习笔记

    gcc and g++分别是GNU的c & c++编译器.gcc/g++在执行编译的时候一般有下面4步: 1 预处理,生成.i的文件. 命令如下:g++ -E  test.cpp 此命令只进行 ...

  3. 学习总结:gcc/g++ 编译与链接

    gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处 ...

  4. gcc/g++命令参数笔记

    1. gcc -E source_file.c -E,只执行到预编译.直接输出预编译结果. 2. gcc -S source_file.c -S,只执行到源代码到汇编代码的转换,输出汇编代码. 3. ...

  5. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  6. Makefile的学习笔记

    Makefile的学习笔记 标签: makefilewildcard扩展includeshellfile 2012-01-03 00:07 9586人阅读 评论(2) 收藏 举报  分类: Linux ...

  7. android cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)

    引用:http://weimingtom.iteye.com/blog/1483566 (20121108)注意:这篇文章用cdt编译ndk工程的内容已过时(现在可以用adt-bundle,避免配置繁 ...

  8. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  9. EasyARM i.mx287学习笔记——通过modbus tcp控制GPIO

    0 前言     本文使用freemodbus协议栈,在EasyARM i.mx287上实现了modbus tcp从机. 在该从机中定义了线圈寄存器.当中线圈寄存器地址较低的4位和EasyARM的P2 ...

随机推荐

  1. KafkaOffsetMonitor

    Kafka实战-KafkaOffsetMonitor   1.概述 前面给大家介绍了Kafka的背景以及一些应用场景,并附带上演示了Kafka的简单示例.然后,在开发的过程当中,我们会发现一些问题,那 ...

  2. MVC基本概念和流程

    MVC基本概念和流程 MVC的概念 Model(模型):包含数据和行为.不过现在一般都分离开来:Value Object(数据) 和 服务层(行为). View(视图):负责进行模型的展示,一般就是展 ...

  3. [全国首发]Swift视频教程

    我真的很抱歉,每个人,从7带班开始到现在,最后的成品带. 到了最新的版本号,Swift语言一直在更新,非常多写法都变了.大家能够加我私人微信:wanghj29,我会在朋友圈更新swift的最新动态.此 ...

  4. Net开源网络爬虫

    转载.Net开源网络爬虫Abot介绍 .Net中也有很多很多开源的爬虫工具,abot就是其中之一.Abot是一个开源的.net爬虫,速度快,易于使用和扩展.项目的地址是https://code.goo ...

  5. Facebook HHVM 和 Hack 手册 --- 2. HHVM能做什么

    HHWM简介: HHWM(HipHop VM) 是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT(Just-In- Time)编译器,同时具有产生快速代码和即时编译的优点. ...

  6. Node+Express+MongoDB + Socket.io搭建实时聊天应用

    Node+Express+MongoDB + Socket.io搭建实时聊天应用 前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战 ...

  7. installshield制作的安装包卸载时提示重启动的原因以及解决办法

    原文:installshield制作的安装包卸载时提示重启动的原因以及解决办法 有时候卸载installshield制作的安装包程序,卸载完会提示是否重启电脑以完成所有卸载,产生这个提示的常见原因有如 ...

  8. selenium2入门 用testNG对百度首页输入框进行测试 (三)

    如果还没有安装testNG的亲,可以点击http://www.cnblogs.com/milanmi/p/4346580.html查看安装过程. 这节主要是对百度首页的输入框进行输入测试. packa ...

  9. WEB浏览器与服务器通讯过程

    以访问网页www.baidu.com为例,下面是使用Wireshark捕捉到的数据: 浏览器先发起一个TCP连接,然后发送GET报文给服务器,服务器之后返回一个Response报文. 从服务器端返回时 ...

  10. Guava之简介

    1.介绍 Guava最初是在2007年作为“Google Collection  Library” 出现的,这个项目在处理Java集合时提供了一些有用的工具,Google的这个guava项目已经成为了 ...