入门系列:基础认知——gcc认识

说明
  本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
  QQ 群 号:513683159 【相互学习】
内容来源
  GCC 参数详解
  GCC基本知识
  GCC发展历史
  GCC的组成部分以及使用到的软件
  GCC 各工具使用简介
  Linux下七种文件类型、文件属性及其查看方法
  Linux中,如何识别不同的文件类型
  Linux下的文件类型及文件后缀名详解
  Linux下七种文件类型、文件属性及其查看方法

认识GCC

  GNU项目计划开发出几个广为流传的GNU软件:GNU C Commplier(gcc)、GNU emacs、GNU Debugger(gdb)、GNU Bash等。
  一开始gcc只支持C语言,随着发展现今可支持多种语言,故现在的gcc已转变为:GNU Commplier Collection (GNU编译器家族)。部分工具如下表:

工具名 描述
gcc C 编译器
g++ C++ 编译器
cpp C 预处理器
as GNU汇编器
一族汇编器,故可以被编泽后能够在各种不同平台上工作
ld GNU 连接器
该程序将目标文件的集合组合成可执行程序
gdb GNU 调试器
可用于检查程序运行时的值和行为
ar 可通过从文档中增加、删除和析取文件来维护库文件
通常使用该工具是为了创建和管理连接程序使用的目标库文档
nm 列出目标文件的符号表中定义的符号
objcopy 目标文件翻译器,用于从连接器输出中创建一个ROM 映像
将目标文件从一种二进制格式复制和翻译到另外一种
objdump 目标文件阅读器, 用于反汇编目标文件
显示一个或多个目标文件中保存的多种不同信息
autoconf 产生的 shell 脚木自动配置源代码包去编泽某个特定版本的 UNIX
make 读取makefile 脚本确定程序中的编泽和连接的次序
readelf 从 ELF 格式的目标文件显示信息
size 列出目标文件中每个部分的名字和尺寸
strings 浏览所有类型的文件,析取出用于显示的字符串
strip 从目标文件或文档库中去掉符号表,以及其他调试所需的信息。

编译流程

  由源程序形成可执行文件的过程被细分为以下四个阶段。
                    hello.c (源代码)
    阶段一:预处理(preprocessing)    ||  【预处理器cpp】
                    hello.i(预编译后代码):在源代码中插入头文件宏替换等(处理以“#”开始的预处理指令)。
    阶段二:编译(compile)        ||  【编译器egcs】
                    hello.s(汇编源代码):编译器对代码优化,得到汇编文件。
    阶段三:汇编(assembly)       ||  【汇编器as】
                    hello.o(目标文件):已经可执行的二进制文件。
    阶段四:链接(link)          ||  【链接器ld】
                     hello(.out)(可执行文件):将目标文件与系统或用户提供的库链接为可执行文件。

Linux下文件后缀名:

  .c 为后缀的文件:C语言代码文件.
  .C/.cc/.cxx 为后缀的文件:是C++源代码文件.
  .h 为后缀的文件:头文件.
  .i/.ii 为后缀的文件:已预处理过的C/C++源代码文件
  .s 为后缀的文件:是汇编语言源代码文件.
  .o 为后缀的文件:是编译后的目标文件.
  .a 为后缀的文件:是由目标文件构成的静态库文件.
  .so 为后缀的文件: 动态库文件
PS:
  Windows下:文件根据后缀名判断文件类型。
  Linux下:文件不可根据后缀名判断文件类型,而是与文件属性有关。
    可执行文件没有统一后缀名,而是根据文件属性区分可不可执行。
    gcc可通过后缀区别输入文件类别。

编译选项

  GCC编译选项大约有100多个,以下为最基本、最常用的。

-E:只运行C预编译器cpp,不生成文件 (只执行到第1阶段)
-S:只把文件编译成为汇编代码 (只执行到第2阶段)
-c:只生成object文件,不链接 (只执行到第3阶段)

  编译器只是由输入的.c等源代码文件编译生成.o后缀的中间文件。

-o output_filename:确定可执行文件名为output_filename.(只执行到第4阶段)

  若不给出这个选项,gcc就给出预设的可执行文件a.out.

-O或-O1:优化编译、连接。 -O2:优化编译、连接(优于-O)但过程会更慢。( 还有-O和-O3都类似)

  整个源代码会在编译、连接过程进行优化处理,这样产生的可执行文件执行效率可提高。但编译、连接的速度就相应地慢一些。

-g:对编译出的程序进行调试。

  产生调试工具(gdb),进行调试。

-Wall:生成所有警告信息、-w:不生成任何警告信息

  编译错误:一般代码出现语法错误,无法编译执行,必须修改。
  编译警告:编译器发现程序中出现不合理地方(ru:类型不匹配),建议最好修改(但也可编译执行)

-shared:生成支持动态共享库的执行文件
-static: 不支持动态共享库,把函数库内容静态链接到可执行程序中,生成的可执行文件不依赖库文件
-D macro=xxx:定义MACRO宏

  等效于在程序中使用#define macro xxx.

-I dirname:指定额外的头文件搜索路径dirname

  将dirname所指目录作为编译器寻找头文件标准路径。有两种情况:
    ①< >:在预设头文件目录下搜寻(如:/usr/include)。
    ②“ ”:在当前目录下搜寻头文件。
  若用-I则告诉gcc到指定dirname中寻找。

-L dirname:指定额外的库函数搜索路径dirname

  会在系统目录/lib、/usr/lib下搜索,故需将对应的库防止系统目录下。
  若动态库和静态库同名则优先动态库。

-l libraryname:指定链接时需要函数库

  库名:liblibraryname.so/liblibraryname.a,链接时去掉后缀.so和版本号以及前缀lib

-fPIC:生成位置无关目标代码,适用于动态连接。

常用命令:

  ldd:列出一个程序所需要得动态链接库(so)
  file查看文件格式信息。
  ldconfig:在搜寻目录下搜索出可以共享的动态链接库

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值