Linux编译器-gcc/g++的基础使用

文章介绍了GCC和G++作为C/C++编译器的角色,以及编译程序的四个步骤:预处理、编译、汇编和链接。讨论了gcc/g++的常用编译选项,并解释了动静态链接库的概念,特别是如何通过静态库和动态库实现函数调用。默认情况下,gcc生成的是动态链接的可执行文件。
摘要由CSDN通过智能技术生成

一.gcc、g++介绍

gcc是一个c语言编译器,g++也是一个c++语言编译器,它们只负责编译,和平时用的Visual studio不是一个层次,VS(简称)不仅可以编译代码还可以编译执行代码,也能够调试代码。它是整合了很多功能的集成开发环境,简称IDE。

二.编译程序的过程

  • 预处理 (Pre-Processing)
  • 编译(Compiling)
  • 汇编(Assembling)
  • 链接(Linking)

在这里插入图片描述
hello程序是对于计算机来说,计算机是看不懂的,必须要将每条C语句都转化为低级机器指令。然后将这些指令汇编并链接在一起成为可执行目标文件格式,并以二进制形式存储与磁盘中。

三、gcc/g++的常用选项

在这里插入图片描述使用gcc
示例:

gcc -E hello.c -o hello.i                    #预处理
gcc -S hello.i -o hello.s                    #编译
gcc -c hello.s -o hello.o                    #汇编
gcc hello.o -o hello                         #链接
gcc hello.c -o hello                         #直接编译链接成可执行目标文件
gcc -c hello.c 或 gcc -c hello.c -o hello.o  #编译生成可重定位目标文件

g++跟上述一样格式

四、动静态链接库

在gcc/g++链接中,我们需要涉及到一个重要的概念:函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

函数库分为一种静态库,另一种动态库.

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello
    *gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。
    在这里插入图片描述
    使用gcc加上-static选项,链接时就是静态链接
    在这里插入图片描述
    使用静态库编译的文件明显占用的空间比使用动态库编译的文件更大
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值