【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识

这篇具有很好参考价值的文章主要介绍了【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


这篇文章我们继续学习Linux中的开发工具,今天要学的是:
Linux下的编译器——gcc/g++

1. 概念

我们先来简单了解一下它们的概念:

gcc (GNU Compiler Collection) 和 g++ 是 Linux 系统上最常用的编译器。它们是 GNU 组织开发的一套开源编译器工具集。

gcc:

gcc 是 GNU 编译器集合中的 C 语言编译器。
它支持多种 C 语言标准(如 ANSI C、ISO C89、ISO C99)以及一些扩展特性。
gcc 可以将 C 语言源代码编译成可执行文件,或者生成汇编代码和目标文件。

g++:

g++ 是 GNU 编译器集合中的 C++ 语言编译器。
它在 gcc 的基础上添加了对 C++ 语言的支持,包括标准 C++ 和一些扩展特性。
g++ 可以将 C++ 源代码编译成可执行文件,或者生成汇编代码和目标文件。

gcc 和 g++ 的选项基本上都是一样的,我们这里就重点以gcc为例来进行讲解。

2. gcc 的使用

通过上面的了解我们知道gcc 和 g++ 其实就是Linux系统上的编译器。

编译器其实就是是一种将高级程序代码(如 C、C++、Java 等)转换为低级机器代码或可执行文件的软件工具。

那在之前C语言的学习阶段,我们其实有一篇文章比较详细的讲解了一下一个C程序从源文件变成可执行程序的过程

【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
大家如果不太清楚或者忘了的话可以复习一下——【C进阶】——我们写的代码是如何一步步变成可执行程序(.EXE)的?
编译器做的工作其实就是对应图中的翻译环境中的几步。

那至于详细的过程,我们这里就不再展开讨论了(大家可以看之前的文章),不过我们再来结合操作简单的复习一下

之前的时候我们讲解的并没有让大家关心具体的操作,那现在,大家就需要来学习一下操作过程中的这样命令了。
我先来创建一个源文件myfile.c
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
对于这样一个源文件,如果我们直接gcc编译的话,他会直接做完整个翻译过程,自动生成一个名为a.out的可执行文件
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
我们就可以直接执行输出结果。
那其实这个可执行文件的名字我们是可以自己指定的
gcc -o 新生成文件名 原文件名
"-o"选项用于指定生成的可执行文件或目标文件的名称。
-o之后一定是加我们自己给新生成文件起的名字
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器

对于程序的翻译,分为下面几个过程:

2.1 预处理(预编译)

预处理阶段主要完成头文件的展开、宏替换、条件编译和去掉注释等工作。

那上面我们演示的是从源文件直接生成可执行文件,那如果我想让它执行完预处理过程就停下来呢?

这里用到另一个选项:-E
-E:预处理之后就停下来
所以我执行gcc -E myfile.c
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
但是这样直接执行之后它会把预处理之后文件的内容直接显示到显示器上,这样不太好看。

所以我们也可以-o指定一下文件名,把它放到对应文件里

那对于预处理之后的文件,一般后缀为.i
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
首先我们可以观察到预处理之后文件大小大了很多。
然后我们可以用vim打开观察一下,当然打开myfile.c的同时我们可以借助vs 文件名同时显示myfile.i,分屏显示,对比观察一下
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
这里看到myfile.i的内容是比较多的,我们看看他又多少行
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
一共有800多行,当然这个其实我们C语言那篇文章也带大家看过,其实前面多的这么多东西就是头文件展开的内容,当然还会做一些其它动作比如注释的删除、宏替换和条件编译语句的处理等。
不过这里我们没用这么多东西。

2.2 编译

编译过程,就是把预处理之后的C语言代码转换成汇编代码

那如果我想让编译结束停下来呢?

-S:编译结束就停止
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
那这里我们看到不指定名字的话,他自动把生成的文件命名为.s后缀的(编译之后文件后缀为.s)
当然我们还可以自己指定
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
那我们打开看一下
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
那这里里面放的其实就是对应的汇编代码

2.3 汇编

汇编其实就是把汇编指令转化为二进制的机器指令,生成对应的可重定位的二进制目标文件。

那我想查看汇编之后的文件:

-c:汇编结束就停止
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
当然这个我们是看不懂的,它是一种二进制文件
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器

2.4 链接

链接过程是将多个目标文件(可重定位目标文件)以及库文件组合在一起,生成最终的可执行文件。

那要链接生成可执行文件的话其实就不用选项了:

直接对汇编生成的.o文件进行gcc就可以生成最终的可执行程序

【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
就可以执行了
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器

把这整个过程我们又过了一遍。
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器

但是,下面关于链接过程中的某些内容,我们还要来探讨一下

3. 动态库和静态库

上面说到在链接过程中我们的程序会和用到的一些库链接到一起。

大家思考一个问题,为什么我们在Linux上可以进行C/C++代码的编译链接这些动作呢?

其实其中一个比较重要的原因就是Linux提供了这些语言所需要的开发库,如标准C库(libc)、标准C++库(libstdc++)以及其他各种系统库和第三方库。这些库提供了大量的函数和工具,方便开发者编写各种类型的应用程序。
那其实我们可以看一下我们当前的Linux系统上都提供了那些库:
ls /usr/include
在这个路径下
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
我们看到里面有些头文件其实是我们比较熟悉的。

那下面我们就来学习这样一条命令:

ldd:ldd命令用于打印一个可执行文件或共享库文件依赖的动态链接库(shared library)列表。它会递归地检查可执行文件或共享库文件所依赖的其他库文件,以及这些依赖的库文件的依赖,一直到所有依赖的库文件列表打印完毕。

比如,对于我们上面生成的可执行程序,我们就可以使用ldd命令查看一下它都依赖了哪些库

【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
我们看到这里打印出来有3条,不过我们重点关心一下第二个。
第二个libc.so.6其实就是Linux中的C标准库。

另外我们在安装一些ide的时候,比如就拿我用的这个vs2022来说,我们安装它的时候,其实一个比较重要的工作就是安装相关的库之类的东西。
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
就类似这个图。

在这里涉及到一个重要的概念——库(函数库)

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

那说到库,其实分为两种(库本质也是文件):

  1. 动态库

在Linux中,动态库一般是以lib开头,.so为后缀
即libXXXXX.so

  1. 静态库

静态库一般以lib开头,.a为后缀
即libXXXXX.a

3.1 动静态库的理解

那这里提到的动态库和静态库该怎么理解呢?

当我们谈论库(Library)时,可以将其比作图书馆,而静态库和动态库则是两种不同的图书存放方式。

想象一下,你是一名学生,图书馆中有很多有用的书籍,供你在学习过程中参考使用。

静态库(Static Library) 类似于你个人的书包,你从图书馆中选择了一些书籍,把它们拷贝到你的书包里。这些书籍是你个人拥有的,可以在需要的时候直接使用。当你需要使用这些书籍时,你只需从书包中取出,不需要依赖图书馆,也不会影响其他学生。

在编程中,静态库是在编译时将库的代码和程序代码链接在一起,形成一个单独的可执行文件。这意味着静态库的代码被复制到了最终的可执行文件中(这种链接方式我们称为静态链接),程序在运行时不需要外部的库文件依赖。这样做的好处是,程序更加独立,可以在不同的系统中运行,不受外部环境的影响。
但是生成的文件比较大。

动态库(Dynamic Library) 类似于图书馆中的共享书架,每个学生都可以访问这些书架上的书籍。当你需要使用这些书籍时,你可以从书架上取出,使用完毕后放回书架上供其他人使用。这意味着多个程序可以共享同一个动态库,减少了存储空间的占用。

在编程中,动态库是在运行时由操作系统加载的库文件,程序在运行时需要由链接器引入动态库,才能使用其中的函数或资源。可执行文件中只包含对库函数的引用或者说地址,而不复制库的代码和数据(动态链接)。这样做的好处是,多个程序可以共享同一个动态库,减少了内存的占用和可执行文件的大小。

总结起来:

静态库将库的代码复制到可执行文件中,使得程序独立运行;动态库则共享在操作系统中,减少了内存占用和可执行文件的大小。静态库适合小型独立程序,而动态库适合大型程序或多个程序共享使用。
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器

3.2 默认是动态链接,我们如何进行静态

然后想告诉大家,在我们的Linux上,默认只有动态库,进行的是动态链接

之前我们学过一个file指令,它可以更清晰的显示一个文件的类型
我们执行file myfile.exe【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
就可以看到里面有一个dynamically linked,它的意思就是动态链接

那如果我们想进行静态链接,能做到吗?

可以的。
不过呢,一般我们的Linux上默认只有动态库,所以,如果想进行静态链接的话,需要先安装一下静态库:
yum install -y glibc-static libstdc++-static
把指令给大家,大家直接执行就行(普通用户+sudo),这条指令是把C和C++的静态库都安装上的。

然后就可以进行静态链接了

对应的命令是
gcc -static:静态链接
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
🆗,大家看到了吗,静态链接生成的可执行文件比动态链接生成的大了好多好多。
我们也可以用file查看一下静态链接生成的可执行文件
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器
里面也能看到静态链接statically linked

关于动静态库我们先了解到这里,后续还会进行更深入的学习…
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识,Linux 系统编程,linux,运维,服务器文章来源地址https://www.toymoban.com/news/detail-576793.html

到了这里,关于【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Linux】编译器-gcc/g++使用

    【Linux】编译器-gcc/g++使用

    个人主页 : zxctscl 文章封面来自:艺术家–贤海林 如有转载请先通知 在之前已经分享了 【Linux】vim的使用,这次来看看在云服务器上的编译器gcc。 我们先写一段简单的代码: 当我们进行编译的时候: 发现根本就编译不了。 这个是因为编译器版本的问题: 查看编译器的版

    2024年03月11日
    浏览(10)
  • Linux的学习之路:6、Linux编译器-gcc/g++使用

    Linux的学习之路:6、Linux编译器-gcc/g++使用

    本文主要是说一些gcc的使用,g++和gcc使用一样就没有特殊讲述。 目录 摘要 一、背景知识 二、gcc如何完成 1、预处理(进行宏替换) 2、编译(生成汇编) 3、汇编(生成机器可识别代码 4、链接(生成可执行文件或库文件) 5、函数库 6、静态库和动态库 7、gcc选项 三、思维导图

    2024年04月23日
    浏览(17)
  • Linux驱动开发笔记(二):ubuntu系统从源码编译安装gcc7.3.0编译器

    Linux驱动开发笔记(二):ubuntu系统从源码编译安装gcc7.3.0编译器

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130533941 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:《Linux驱动开发笔记(一

    2024年02月06日
    浏览(14)
  • 【Linux】Linux编译器 gcc/g++的使用&&初识动静态链接库

    【Linux】Linux编译器 gcc/g++的使用&&初识动静态链接库

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯 长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】Linux环境基础工具的基本使用及配置(yum、vim) 在上一篇 Linux 博客中,我们讲解了 vim 编辑器的使用,可以在 Linux 上写

    2024年02月11日
    浏览(21)
  • 【Linux】Linux编译器 gcc 的使用 | 动静态库的初步认识

    【Linux】Linux编译器 gcc 的使用 | 动静态库的初步认识

    👑作者主页:@安 度 因 🏠学习社区:StackFrame 📖专栏链接:Linux

    2024年01月15日
    浏览(15)
  • 【Linux】编译器-gcc/g++与调试器-gdb的使用

    【Linux】编译器-gcc/g++与调试器-gdb的使用

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.gcc/g++语法 2.gcc的使用及编译器是如何\\\"翻译\\\"代码的? (1)预处理 (2)编译 (3)汇编

    2024年02月04日
    浏览(12)
  • 【Linux】编译器gcc和g++与调试器gdb的使用

    【Linux】编译器gcc和g++与调试器gdb的使用

    我们知道,一个程序被运行起来之后需要经历四个阶段然后才变成一个可执行的程序,他们分别为:预处理,编译,汇编和链接。下面我们将介绍这四个阶段的操作,测试代码如下: 1.1 预处理 预处理也叫预编译,程序在预处理阶段会完成如下操作: 展开头文件,将头文件中

    2024年02月07日
    浏览(10)
  • 【探索Linux】—— 强大的命令行工具 P.4(编译器 gcc/g++ 使用)

    【探索Linux】—— 强大的命令行工具 P.4(编译器 gcc/g++ 使用)

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也了解并学习了有关Linux开发工具vim ,也相信大家都掌握的不错,今天博主带大家了解一下Linux编译器 gcc/g++ 使用, 下面话不多说坐稳扶好咱们要开车了!!

    2024年02月12日
    浏览(8)
  • Linux:编译器 - gcc

    Linux:编译器 - gcc

    GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。 gcc是GCC中的C语言编译器,而g++是GCC中的C++编译器。本博客只讲解gcc,g++的语法和选项和gcc都是一致的。 gcc 编译

    2024年04月14日
    浏览(7)
  • Linux:详解(yum的使用、vim编辑器命令集合以及gcc/g++编译器的使用)

    Linux:详解(yum的使用、vim编辑器命令集合以及gcc/g++编译器的使用)

            在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.         但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这

    2024年02月05日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包