Linux编译器 gcc/g++

gcc/g++的简介

GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。gcc是GCC中的C语言编译器,而g++是GCC中的C++编译器,使用g++同样可以编译C语言。编译C语言要经过预处理,编译,汇编,链接这四个过程。

格式 : gcc [选项] 要编译的文件 [选项][目标文件]
选项 :

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面,一般而言经过预处理后的文件命名统一格式为 xxx.i
-S 编译到汇编语言不进行汇编和链接,一般而言经过编译后的文件命名统一格式为 xxx.s
-c 编译到目标代码,一般而言经过汇编后的文件命名统一格式为 xxx.o
-o 文件输出到文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库
-O0 -O1 -O2 -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w 不生成任何警告信息。
-Wall 生成所有警告信息

预处理(进行宏替换)

预处理功能主要包括宏定义 , 文件包含 , 条件编译 , 去注释等。
预处理指令是以 # 号开头的代码行。
实例 : gcc –E test.c –o test.i
选项 “-E”, 该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项 “-o” 是指目标文件,这里把预处理后的文件命名为test.i,   “ .i ”文件为已经过预处理的 C 原始程序,一般而言经过预处理后的文件命名统一格式为 xxx.i 。

如何在vim中同时编辑多个文件

1.输入命令vim 文件1 文件2 ,例如vim test.c test.i

2.在底行模式用ls命令查看缓冲区, %a表示正在编辑的文件

3. 使用分屏(Split Screen),在命令模式按下Ctrl + Ws 进入分屏模式,该为上下分屏,或者Ctrl + W, v该为左右分屏,例如以下为左右分屏

4. 在左右两屏中切换,在命令模式按下Ctrl + W, w 可以在两屏中来回切换

5.切换编辑的文件,在底行模式按bnext,可以切换到第二个文件

6. 保存退出

保存所有并退出:wqa

编译(生成汇编)

在这个阶段中 ,gcc 首先要检查代码的规范性、是否有语法错误等 , 以确定代码的实际要做的工作 , 在检查无误后,gcc 把代码翻译成汇编语言。用户可以使用“-S” 选项来进行查看 , 该选项只进行编译而不进行汇编,生成汇编代码,一般而言经过编译后的文件命名统一格式为 xxx.s
实例 : gcc –S test.i –o test.s

汇编(生成机器可识别代码)

汇编阶段是把编译阶段生成的 “.s” 文件转成目标文件.读者在此可使用选项“-c” 就可看到汇编代码已转化为 “.o”的二进制目标代码了,该阶段文件在Linux中后缀为.o  在Windows为.obj
实例 : gcc –c test.s –o test.o

链接(生成可执行文件或库文件)

在成功编译之后 ,就进入了链接阶段。

我们的C语言内部,调用很多库函数,比如printf,scanf等等。它们并没有在编译的时候展开,不信你可以回去看看那个.i文件,绝对没有展开一个叫做printf的函数。那么C语言要如何拿到这个函数,并调用它呢?这就涉及到链接的过程。如果你想要让你的.c,.i,.s,.o中的任意一个文件变成链接后的文件,不用带任何选项,直接执行gcc即可,因为直接执行就是生成可执行文件,这已经是链接后的文件了。这样最后生成的test就是可执行文件了,在Windows中,可执行文件的后缀就是.exe,因为Windows通过后缀区分文件,而Linux不通过后缀区分文件.

实例: gcc  test.o –o test

函数库

我们的 C 程序中,并没有定义 “printf” 的函数实现 , 且在预编译中包含的 “stdio.h” 中也只有该函数的声明 , 而没有定义函数的实现, 那么 , 是在哪里实 “printf” 函数的呢 ?
最后的答案是 : 系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了 , 在没有特别指定时 ,gcc 会到系统默认的搜索路径“/usr/lib” 下进行查找 , 也就是链接到 libc.so.6 库函数中去 , 这样就能实现函
“printf” , 而这也就是链接的作用.

1. lld 命令

功能:可以通过ldd指令来查看一个可执行文件链接了那些库

比如第二行的libc就是C语言的标准库。另外的,它还指明了一些库在系统中的路径。也就是说我们的很多头文件,都已经早早地在Linux中下载好了,因此我们可以在Linux上运行C语言代码。

比如说/usr/include路径下的文件:

2. 函数库一般分为静态库和动态库两种

静态库是指编译链接时 , 把库文件的代码全部加入到可执行文件中 , 因此生成的文件比较大 , 但在运行时也就不再需要库文件了。其后缀名一般为“.a”
动态库与之相反, 在编译链接时并没有把库文件的代码加入到可执行文件中 , 而是在程序执行时由运行时链接文件加载库, 这样可以节省系统的开销。动态库一般后缀名为 “.so”, 如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后 ,gcc 就可以生成可执行文件。
Linux中,动态库以.so为后缀,静态库以.a为后缀
Windows中,动态库以.dll为后缀,静态库以.lib为后缀
如果我们想要生成静态链接的文件,则额外加上选项 -static

动态链接
优点 :省空间(磁盘的空间,内存的空间),程序体积小,加载速度快
缺点 :依赖动态库,程序运行可移植性较差

静态链接
优点: 不依赖第三方库,程序运行可移植性较好
缺点:浪费空间(磁盘的空间,内存的空间),程序体积大,加载速度慢


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要满血复活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值