GCC(GNU编译器套件)常用简要介绍

1、前言

最近闲来无事就看了下GCC的文档, 找到了些重要且常用的知识点,于是将其mark下来并写下阅读后的感悟,留待以后翻阅查看。

 

2、名词解析

GCC:GNU Compiler Collection(GUN 编译器集合), 我在百科找到了其描述。

gcc:GCC中的GUN C Compiler(C 编译器),我们通常认为它是一个c编译器,但看到上边描述,可以知道这样说不尽正确。

g++是GCC中的GUN C++ Compiler(C++编译器)

 

3、gcc选项汇总

GCC(GNU编译器套件)常用简要介绍_第1张图片

summary中列出个各种情况下的选项。例如常用的-E, -S, -c, -o等等。

 

4、对文件类型的识别

通过文件的后缀名来识别不同的文件。以下是各种文件类型(具体可查阅文档)

GCC(GNU编译器套件)常用简要介绍_第2张图片

以下列出一些常用的:

  1. c源码:file.c
  2. c/c++头文件:file.h
  3. C++源码:file.cpp
  4. c预处理文件:file.i
  5. C++预处理文件:file.ii
  6. 汇编文件:file.s

有些同学可能会说, 程序员知道是什么文件就可以了, 并不需要严格准守这个文件命名、其实并不对, gcc编译程序的过程可分为四个步骤:预处理, 编译,汇编和链接。每个可执行的应用程序都是严格按照这个步骤去执行生成的。

如果我们不是一步就完成引用程序的编译( 不执行最后链接操作, 利用-E -S -c等停止执行),那么就需要指定当前输入文件是什么类型。因为构建的过程是有序的, 例如如果当前的文件是完成汇编产生的目标文件了, 那就就当然不能对目标文件进行 -E 预处理操作了。

我们通常是正常地命名文件, 使用文件的后缀名让编译器知道当前输入文件是什么类型的文件。但凡事总有意外。例如我们对C++预处理文件main.i2进行编译处理, 需要生成汇编文件main.s2, 但是执行命令可以看到有警告linker input file unused because linking not done, 并且main.s2也没有能够生成。就是因为编译器不知道main.i2是什么类型的文件。

那么其实我们只要用-x指令指明这是什么文件那么就可以运行通过了。-x选项的使用已经不同类型文件的language代码如下图所示:

GCC(GNU编译器套件)常用简要介绍_第3张图片

所以最后我们的命令应该改成

g++ -x c++ -S main.i2 -o main.s2

 

5、编译的步骤

编译的分为4个步骤:预处理, 编译, 汇编和链接。

GCC(GNU编译器套件)常用简要介绍_第4张图片

对应几个步骤的编译选项如下:

GCC(GNU编译器套件)常用简要介绍_第5张图片

 

6、编译C++程序

c++代码最好还是使用g++在编译。

GCC(GNU编译器套件)常用简要介绍_第6张图片

 

7、指定版本,标准

C++许多标准, 如最新的C++11标准, 如果你的代码有用到c++11的语言特性, 在编译的时候就需要指定标准-std=c++11.

可以注意到下图-ansi 其实等同于-std=c90。ansi(美国国家标准学会(AMERICAN NATIONAL STANDARDS INSTITUTE: ANSI)), 是C语言的一种标准。我记得当时在看lua的源码时, lua作者有说到为了保证lua的移植性,lua源码严格地按照ansi c 标准编写。

GCC(GNU编译器套件)常用简要介绍_第7张图片

 

8、链接选项

GCC(GNU编译器套件)常用简要介绍_第8张图片

使用-l去链接一个库文件, 记得库文件的文件名组织方式都是 lib + 库名 + .a 或者 lib + 库名 + .so。

GCC(GNU编译器套件)常用简要介绍_第9张图片

我们常用 -shared -fpic 选项去将目标文件链接成动态链接库。

 

9、寻址路径

有我们常用的-I 寻找第三方头文件的路径

-L 寻找第三方库目录的路径

GCC(GNU编译器套件)常用简要介绍_第10张图片

 

最后分享一个查看文档和快速查看编译选项的链接接:https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Option-Summary.html#Option-Summary

 

 

你可能感兴趣的:(GCC(GNU编译器套件)常用简要介绍)