GNU Compiler Collection简介,基础命令以及常用参数

目录

  • GNU Compiler Collection简介
  • GCC能做什么?
  • gcc/g++和Binutils基本指令
    • gcc/g++
      • 生成预处理文件
      • 生成汇编文件
      • 生成目标文件
      • 构建可执行文件
      • 生成动态库
    • Binutils
      • ar文档管理工具
        • 生成静态库
      • nm库符号表读取工具
        • 查看符号表
      • readelf,ranlib等待补充
  • gcc编译器的常用参数

GNU Compiler Collection简介

GNU Compiler Collection,即GNU编译工具集。GNU指的是GNU(革奴)计划,是由理查德斯托曼带头开发的自由软件创作计划,原目标是构建一款自由开放的操作系统(Hurd内核+GNU配套系统软件),GCC就是属于计划中配套系统软件这部分。这段开源历史大家可以自行了解,很有趣

GCC编译工具集可以处理的语言不局限于C/C++,还包括C/C++的各种方言标准,Go,Fortan等其他语言,工具集中主要有:

  • 核心编译器:gcc/g++
  • 二进制工具集Binutils:汇编器as,链接器ld,库封包工具ar,目标格式查看器readelf等
  • C/C++语言的标准库:glibc,libstdc++等

除了强大的功能以外,GCC还具有很高的可移植性,在不同架构的很多操作系统上都可以使用,包括GNU系操作系统,Linux, Windows,MacOS,BSD等

GCC能做什么?

GCC工具集最主要的功能就是将C/C++的源码编译成对应平台可执行文件或者库;里面的部分工具还可以协助逆向,分析可执行文件等

可执行文件构建的一般流程为:

  • 源文件 - 》预处理 - 》编译 - 》 汇编 -》 链接 - 》 可执行文件

库的构建的一般流程为:

  • 源文件 - 》预处理 - 》编译 - 》 汇编 -》打包-》库

编译还分为两种情况:

  • 当编译平台和执行平台一致时,称为本地编译,例如你在PC上进行编译,最终生成的程序也会在PC上执行;
  • 当编译平台和执行平台不一致时,称为交叉编译,例如你在PC上使用Keil开发51单片机程序并编译成固件,最终在单片机上执行;经常接触嵌入式的开发者,对交叉编译很熟悉

gcc/g++和Binutils基本指令

gcc/g++

GCC编译工具集中的gcc编译器,一般来说可以完成大部分工作,包括预处理,编译,汇编,链接

生成预处理文件

gcc -E 源文件.c -o 源文件.i

生成预处理文件指令仅会在屏幕输出源文件预处理后的内容,不会生成文件,可以通过重定向标准输出得到对应预处理.i文件。预处理操作主要包括宏替换展开,头文件包含,条件编译等

生成汇编文件

gcc -S 源文件.c

生成汇编文件指令可以通过源文件生成对应汇编文件,后缀名为.s。汇编操作主要就是将源文件的C/C语言转换成了汇编语言

生成目标文件

gcc -c 源文件.c

生成目标文件指令可以通过源文件生成对应中间目标文件,后缀名为.o。目标指令的操作主要就是将源文件转换成中间目标文件,文件内容已经属于机器语言,人类不可读

构建可执行文件

gcc -o 源文件.c

构建可执行文件指令可以通过源文件生成可执行文件,文件名一般为a.out(Windows平台为a.exe)。可执行文件可以直接执行,完成开发者设定的任务

生成动态库

gcc -shared -fPIC -o 动态库名.so 源文件.c

生成动态库指令可以将源文件打包生成动态库,后缀名为.so(Windows平台为.dll)。在Windows平台中动态库还有对应导入库的概念,相对Linux更复杂。

Binutils

ar文档管理工具

ar文档管理工具常用方法是打包中间目标文件生成静态库,当然它也可以修改库,从库中提取模块

生成静态库

ar rcs 静态库名.a 中间目标文件.o

生成静态库指令可以将中间目标文件打包生成静态库,后缀名为.a(Windows平台为.lib)。
r参数的意义为在库中插入模块,当向库中插入存在对应模块时会产生替换,插入新模块时,会插入到库的末尾
c参数的意义为创建库,无论库是否存在
s参数的意义为创建目标索引,当库文件较大,内容较多时,索引可以加快编译速度,如果不加s参数,后续可以通过ranlib工具或者ar s命令加入

nm库符号表读取工具

NM库符号表读取工具用于读取静态库或动态库中的符号表信息,包括值,类型,名称

查看符号表

nm 动态库.so/静态库.a

查看符号表指令可以输出对应动态库/静态库中的对应接口符号表信息,一般用于确认库内部数据

readelf,ranlib等待补充

gcc编译器的常用参数

GCC编译器编译可执行程序时,可以加入可选参数,用于加入自定义头文件/库,查看编译信息,优化编译流程,加入调试信息等等

参数 意义
-O0 、-O1 、-O2 、-O3 用于编译优化,可选四个参数,-O0为没有优化,-O1为默认值,-O3优化级别最高
-Idir 用于指定头文件搜索路径,dir为文件夹名称。如-Imod
-Ldir 用于指定库文件搜索路径,dir为文件夹名称 。如-Llib
-llibname 用于来链接指定库文件,libname为库名称;同名动态库静态库都存在时,优先链接动态库;注意所链接的静态/动态库文件名必须为lib+xxx.a或so的格式,libname为xxx。如libtest.a库对应链接指令为-ltest
-w 不生成任何警告信息
-Wall 显示所有警告信息
-static 强制使用静态库链接

你可能感兴趣的:(灵感,linux,c语言)