Linux :vim ,gcc ,makefile 三件套之gcc

gcc

1,什么是gcc

​ 要理解gcc是什么,我们需要先简单了解一下,什么是GNU(GNU’s NOT UNIX),简单来说,GUN是一个操作系统,是完全自由,且和Unix兼容的系统,这个操作系统由很多部分组成,包括自由软件,GPL许可证,GUN工具,Hurd内核等等,其中最常用的,就是GNU工具,它包含以下工具:

GNU Bash(Bourne Again SHell):一种常见的命令行 shell。
GCC(GNU Compiler Collection):包括 C、C++、Fortran 等多种编程语言的编译器。
GNU Coreutils:包含了基本的命令行工具,如 ls、cp、mv 等。

这些工具为我们的Linux操作系统提供了基础,使其成为了一个完整的操作系统。

没错!GCC就是GNU工具里的一个工具,他是多种语言的一个编译器。

2,编译过程

​ 那么我们已经知道了,gcc是linux下常用的编译工具,所以首先,我们需要了解一下编译的过程。

​ gcc编译分为预处理,编译,汇编,链接四个基本过程,接下来我们逐一介绍他们的作用。

预处理(gcc -E):预处理由预处理器CPP完成,它会将.c文件预处理为.i文件(.i文件的本质还是一个.c文件)。预处理就是将预处理命令,宏等进行简单的展开和替换。预处理会将#define宏定义替换展开后删除,判断条件编译,将#include<>头文件复制粘贴进来,同时删除注释,添加行号和文件标识,还会保留#pragma编译器指令。

编译(gcc -S):编译由编译器CC完成,它会将.i文件变为.s文件。编译器首先会检查语法规则,然后将C语言翻译为等效的,优化后的汇编语言,我们C语言的可移植性也从这里体现,对于不同的平台,我们只需要选择不同的编译器即可,这样,同一个C语言源代码,就能生成在不同平台上的汇编语言文件。(Ps:优化并不是越高越好,我们常用的配置是OS,它约等于O2等级)。

汇编(gcc -c):汇编由汇编器AS完成,它会将.s文件汇编为.o文件(windows下是.obj文件)。汇编就是将汇编语言转化为对应的二进制文件,也称目标文件,目标文件至少有代码段和数据段两段组成。

链接:链接由链接器LD完成。它会将.o文件通过链接变为ELF文件,即可执行文件。链接会将动态库或者静态库与本文件进行链接,我们在#include<头文件>的时候,头文件中只有函数的声明信息,那么函数体在哪里找呢,没错,就是在动态库和静态库里,而将这些库联合到一起的过程,便称之为链接,链接是通过函数的签名来找到对应的函数体的,同时main函数的入口也是在这个时候确定下来的。

接下来我们了解静态库和动态库,首先我们要清楚,一个函数在应用的时候,我们需要声明它,并且也要有相应的函数体来告诉我们这个函数要干什么,而当我们进入头文件查看的时候,我们会发现,头文件中只有声名,没有函数体,那么函数体存在哪里呢?,就是在静态库or动态库里

3,gcc常用的选项

gcc的编译选项非常非常多,我们可以使用man手册查看,下面是我们经常使用的一些编译选项:
选项 说明
-E 只进行预处理,不编译
-S 只编译,不汇编
-c 只编译、汇编,不链接
-g 编译生成可执行文件包含gdb调试信息,可被gdb调试
-o 指定编译生成可执行文件名
-I 指定include包含文件的搜索目录
-L 指定链接所需库(动态库或静态库)所在路径
-l 指定所需链接库的库名
-ansi ANSI标准
-std=c99 C99标准
-Werror 不区分警告和错误,遇到任何警告都停止编译
-Wall 开启大部分警告提示
–static 静态编译
-static 静态链接
-O0 关闭所有优化选项
-O1 第一级别优化,使用此选项可使可执行文件更小、运行更快,并不会增加太多编译时间,可以简写为-O
-O2 第二级别优化,采用了几乎所有的优化技术,使用此选项会延长编译时间
-O3 第三级别优化,在-O2的基础上增加了产生inline函数、使用寄存器等优化技术
-Os 此选项类似于-O2,作用是优化所占用的空间,但不会进行性能优化,常用于生成最终版本

4,静态库(lib xxx.a)

​ 静态库,动态库的名字,是xxx,而不是libxxx,lib是库的意思,他一般用.a文件来表示。静态库在编译过程中就已经被整合进入了程序之中了,相当于把库中你用到的函数体直接复制进了你的函数里面,这样的好处是生成的程序无序依赖任何外界库,但是缺点就是占内存,同时一旦静态库更新,我们需要重新编译。

静态库的创建

如果希望把源码 file1.c、flle2.c、...fileN.c 做成库文件,则我们可以分别通过下面命令把他们制作成静态库或动态库:
静态库:
gcc -c file1.c
gcc -c file2.c
...
gcc -c fileN.c
ar -rcs libname.a file1.o file2.o ... fileN.o

5,动态库(lib xxx.so lib xxx.dll)

​ 动态库一般用.so文件来表示,windows下是.dll文件。动态库在编译过程并不会被整合进程序里,而是在运行到相关的函数时,才从库中将对应的函数调用给他。这样生成的程序会比用静态库生成的文件小一些,但是缺点就是程序在编译,运行时,都需要依赖对应的动态库。若动态库和静态库同时存在,那么系统一般会优先调用动态库。

动态库的创建

动态库:
gcc -shared -fPIC -o libname.so file1.c file2.c ... fileN.c
使用静态库或动态库:
gcc main.c -o myapp -L lib_path -lname

  • 45
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值