『Linux升级路』基础开发工具——gcc/g++篇

这篇具有很好参考价值的文章主要介绍了『Linux升级路』基础开发工具——gcc/g++篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

『Linux升级路』基础开发工具——gcc/g++篇,linux,运维,服务器

🔥博客主页:小王又困了

📚系列专栏:Linux

🌟人之为学,不日近则日退 

❤️感谢大家点赞👍收藏⭐评论✍️


目录

一、快速认识gcc/g++

 二、预处理

📒1.1头文件展开 

📒1.2条件编译

二、编译

三、汇编

四、链接

📒4.1库的概念

📒4.2库的特点

📒4.3库的分类

📒4.4动态链接

📒4.5静态链接


🗒️前言:

    在前面的文章中我们学会了vim的用法,可以写一些代码,要想让我们的代码运行起来,还需要我们学会编译工具gcc、g++的使用。C语言既可以使用gcc,也可以使用g++;C++只能使用g++,它们的使用形式是相同的,今天以gcc为主,介绍它们的使用方法,带大家快速上手。

一、快速认识gcc/g++

     当我们写完一段代码,想要编译时可以在命令行输入:gcc code.c,会默认形成a.out的可执行程序。

『Linux升级路』基础开发工具——gcc/g++篇,linux,运维,服务器

在输入./a.out,程序就可以执行起来了。

『Linux升级路』基础开发工具——gcc/g++篇,linux,运维,服务器

     当我们不想形成默认的可执行,想让它形成指定名称的可执行,可以输入:gcc code.c -o mycode gcc -o mycode code.c

『Linux升级路』基础开发工具——gcc/g++篇,linux,运维,服务器

编译主要分为预处理、编译、汇编、链接四个过程,我们将详细讲解这四个过程,带大家学会gcc的使用。

 二、预处理

     此阶段处理以 .c .cpp 为扩展名的源文件,并执行预处理指令。预处理器的主要任务是头文件展开条件编译、展开宏定义、移除注释等。预处理指令都是以#开头的代码行。

  • 指令:gcc -E code.c -o code.i
  • -E:从现在开始进行程序的翻译过程,当预处理做完的时候就停止
  • -o:指目标文件,将当前编译结果写入到code.i文件中 
  •  .i 文件为经过预处理的C语言程序(还是C语言)

『Linux升级路』基础开发工具——gcc/g++篇,linux,运维,服务器

📒1.1头文件展开 

     头文件展开,就是在预处理的时候,将头文件拷贝到引用它的源文件中。通过上图我们可以看到,原本14行的代码经过预编译变成了850行。多出的这么多代码,就是把stdio.h文件中的内容插入到当前源文件中。/usr/include/目录是Linux下gcc/g++头文件的默认搜索路径,该路径下有许多和开发相关的头文件。

『Linux升级路』基础开发工具——gcc/g++篇,linux,运维,服务器

头文件的展开过程涉及到#include预处理指令。当预处理器遇到#include指令时,它会打开指定的头文件并将其内容插入到当前源文件的位置。这个过程可以分为两种类型的包含:

  • 系统头文件的包含:

使用尖括号<>包含系统头文件,例如:

#include <stdio.h>

预处理器会在系统头文件目录中查找并打开stdio.h文件,并将其内容插入到当前源文件中。

  •  用户头文件的包含:

 使用双引号 “ ” 包含用户定义的头文件,例如:

#include “test.h”

预处理器会在当前源文件所在目录以及指定的包含路径中查找并打开test.h文件,并将其内容插入到当前源文件中。

📒1.2条件编译

     条件编译就是处理条件编译指令,如#if#ifdef#ifndef#else#elif#endif等。根据条件判断是否编译特定代码块。例如:

#ifdef identifier
    // 代码块 A
#else
    // 代码块 B
#endif

如果已经定义了标识符identifier,则编译 // 代码块 A 部分,否则编译 // 代码块 B 部分。

     条件编译最重要的意义就是对头文件的保护,防止头文件被重复包含。

#ifndef HEADER_FILE
#define HEADER_FILE

// 头文件内容

#endif

在展开头文件时,预处理器会继续递归地处理被包含的头文件。这意味着如果一个头文件包含了另一个头文件,那么这个被包含的头文件也会被展开,以此类推,直到所有的头文件都被插入到源文件中。我们使用上面这段条件编译的代码就可以避免这种情况,如果没有定义HEADER_FILE,就执行下面的代码;如果定义了,就不会执行了。

📝条件编译的主要用途包括: 

  • 平台特定代码: 通过条件编译,可以根据不同的操作系统或硬件平台编写特定的代码。

  • 调试和发布版本: 可以使用条件编译来在调试版本和发布版本之间切换代码。

  • 特定功能的开关: 通过条件编译,可以选择性地包含或排除某些功能,以满足特定的编译需求。

  • 配置选项: 根据不同的配置选项选择性地包含或排除代码,以适应不同的编译环境

二、编译

     在这个阶段,预处理后的源代码(通常是.i文件)被翻译成汇编语言。gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。生成的汇编代码描述了程序的控制流、数据等信息。

  • 指令:gcc -S code.i -o code.s
  • -S:从现在开始进行程序的翻译过程,当编译工作做完的时候就停止

『Linux升级路』基础开发工具——gcc/g++篇,linux,运维,服务器

三、汇编

     在这个阶段,汇编器将汇编代码(通常是.s文件)翻译成机器码或可重定位的机器码。它将汇编代码转换成二进制目标文件,其中包含特定于处理器体系结构的指令。这个二进制文件也被叫做可重定位目标二进制文件,简称目标文件。但是它不能被执行。

  •  指令:gcc -c code.s -o code.o
  • -c:从现在开始进行程序的翻译过程,当汇编工作做完的时候就停止

『Linux升级路』基础开发工具——gcc/g++篇,linux,运维,服务器

📝目标文件为什么不能执行?

     目标文件通常没有定义程序的入口点,即程序的起始地址。可执行文件需要一个明确定义的入口点,从这个点开始执行程序。单独的目标文件可能包含了未解决的符号引用,无法独立执行。可执行文件需要在操作系统上运行,而操作系统提供了运行时支持,包括内存管理、文件操作、进程调度等。没有这些支持,程序很难在操作系统上正确运行。所以,我们还要通过链接来解决这些问题,让目标文件与其他目标文件或库文件进行链接,形成最终的可执行文件。

四、链接

     在这个阶段,链接器将一个或多个目标文件(通常是.o文件)与所需的库文件结合,创建可执行文件。链接的主要任务包括符号解析、地址解析、重定位等,以确保所有部分正确地组合在一起。

  • 指令:gcc  code.o -o mycode

📒4.1库的概念

     库通常指的是包含可重用代码和资源的集合,目的是为了帮助开发者完成特定任务。库可以包含函数、类、变量、子例程等,提供了一组API(应用程序接口)或者工具,使得开发者能够更轻松地完成常见的编程任务,而无需从头开始编写所有的代码。

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

  •  libc.so.6 就是C语言的标准库。 

📒4.2库的特点

  1. 可重用性: 库中的代码可以在不同的程序中被重复使用,从而减少了代码的冗余,提高了开发效率。

  2. 封装性: 库提供了一个封装的接口,隐藏了内部实现的细节,使得开发者可以专注于使用功能而不必关心底层的实现。

  3. 模块化: 库通常被组织成模块,每个模块负责一个特定的功能。这种模块化的设计有助于提高代码的可维护性和可扩展性。

  4. 标准化: 一些库成为了编程的标准,被广泛接受和使用。这样的库通常提供了一些通用的解决方案,被广泛认可并得到社区的支持。

📒4.3库的分类

     库分为两类:动态库静态库。其中Linux环境下,动态库的后缀是.so,静态库的后缀是.a。在Windows环境下,动态库的后缀是.dll,静态库的后缀是.lib。所有的库文件,都遵守相同的命名规则,即:libname.后缀.xxx

  • 静态库(Static Library): 在编译时被链接到程序中,程序在运行前就包含了库的代码。这意味着库的代码被复制到了程序的可执行文件中。

  • 动态库(Dynamic Library): 在运行时被加载到内存中,程序在运行时可以调用库的函数。这样可以减小程序的大小,因为多个程序可以共享同一个库的实例。

 常见的库包括标准库(如C标准库、C++标准库)、图形界面库(如Qt、GTK+)、数学库(如NumPy)、网络库(如libcurl)、以及许多其他领域的专用库。

📒4.4动态链接

     动态链接是一种在程序运行时将代码和数据库链接到程序中的技术。把库中要用到的库函数的地址写到在我们代码中调用这个函数的地方,就是动态链接。

  • 指令ldd 可执行程序,可以查看一个可执行程序所依赖的动态库。

『Linux升级路』基础开发工具——gcc/g++篇,linux,运维,服务器

gcc的默认行为是动态链接 

『Linux升级路』基础开发工具——gcc/g++篇,linux,运维,服务器

🎀动态链接的优点:

  • 节省内存: 多个程序可以共享同一份库的实例,从而节省内存。
  • 易于更新: 更新库时,不需要重新编译所有依赖于该库的程序。只需替换库的新版本即可。
  • 灵活性: 可以在程序运行时动态加载和卸载库,使得程序更加灵活。

🎀 动态链接的缺点:

  • 依赖性:对库的依赖性强 一旦库丢失,所有使用这个库的程序都无法运行

📒4.5静态链接

     静态链接是一种在程序编译时将所有代码和库链接到一个独立的可执行文件的过程。这意味着在程序运行之前,所有的代码和库已经被合并成一个单独的可执行文件。把库中的代码拷贝到我们的可执行程序中,就是静态链接。

在Linux中默认是没有静态库的,需要我们自己安装。

  • sudo yum install -y glibc-static 
  • gcc code.c -o mycode-static -static
  • 其中 -static表示执行静态链接

『Linux升级路』基础开发工具——gcc/g++篇,linux,运维,服务器

🎀静态链接的优点:

  • 独立性: 生成的可执行文件是完全独立的,不需要外部的依赖。这使得程序更容易分发和部署,因为用户只需要一个文件就可以运行程序。
  • 性能: 静态链接的程序在运行时无需进行额外的库加载,因此在一些情况下可能会稍微快于动态链接的程序。

🎀静态链接的缺点:

  • 占用空间: 由于每个可执行文件包含了所需的所有代码和库,因此静态链接的程序通常比动态链接的程序更大。
  • 更新困难: 如果库被更新,需要重新编译并重新分发整个可执行文件,而不仅仅是替换库文件。

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。文章来源地址https://www.toymoban.com/news/detail-752314.html

到了这里,关于『Linux升级路』基础开发工具——gcc/g++篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Linux】环境基础开发工具使用——gcc/g++使用

    1. 预处理(进行宏替换 ) 2. 编译(生成汇编 ) 3. 汇编(生成机器可识别代码) 4. 连接(生成可执行文件或库文件 ) 格式 gcc [ 选项 ] 要编译的文件 [ 选项 ] [ 目标文件 ] 预处理 ( 进行宏替换 ) 预处理功能主要包括宏定义 , 文件包含 , 条件编译 , 去注释等。 预处理指令是以 # 号

    2024年04月09日
    浏览(43)
  • 【Linux环境基础开发工具】编译器-gcc/g++

    上一篇博客, 我们学习了vim编辑工具,学会了怎么写代码, 这篇文章,我将分享代码该怎么编译的问题。 目录 写在前面: 1. gcc和g++介绍 2. gcc是如何编译程序的 1. 预处理 2. 编译 3. 汇编 4. 链接 3. gcc的选项介绍 4. 我们使用的函数是哪来的 5. 我们的.o文件和库是如何链接的?

    2024年02月10日
    浏览(35)
  • Linux:基础开发工具之yum,vim,gcc的使用

    本篇主要总结的是Linux下开发工具 yum vim gcc/g++ 什么是yum? 不管是在手机移动端还是 pc 端,不管是什么操作系统,当用户想要下载一些内容或者工具的时候,都需要到一个特定的位置进行下载,例如在手机上,要下载一些应用的时候就可以去对应的应用商店下载 而在Linux系统

    2024年02月08日
    浏览(35)
  • Linux基础环境开发工具的使用(yum,vim,gcc,g++)

    首先先说明一点: Centos系统适用于yum 而Ubanto适用于apt-get 在Linux中我们也要进行工具/程序/指令的安装,检查和卸载, 而我们安装软件的方式: 1.源代码安装-需要进行交叉编译的工作 一般那些很强的程序员中的大佬才能拿捏 2.rpm包直接安装,也很麻烦 3.yum直接安装 这就需要用到y

    2024年02月06日
    浏览(33)
  • 【Linux升级之路】2_Linux环境基础开发工具使用

    🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux升级之路】 ✒️✒️本篇内容:Linux工具学前常识,Linux编辑器vim的使用,sudo提权指令讲解/配置,Linux编译器gcc/g++的使用,项目自动化构建工具make/makefile的使用,工具实践(小程序-进度条),Linux环境下git的使用

    2023年04月14日
    浏览(30)
  • 『Linux升级路』基础开发工具——yum篇

      🔥 博客主页: 小王又困了 📚 系列专栏: Linux 🌟 人之为学,不日近则日退 ❤️ 感谢大家点赞👍收藏⭐评论✍️   目录 一、Linux下安装软件的方案  📒1.1源代码安装 📒1.2rpm安装 📒1.3yum安装 二、Linux 软件包管理器 yum 📒2.1什么是软件包 📒2.2关于 rzsz 📒2.3查看软件包

    2024年02月06日
    浏览(23)
  • 『Linux升级路』基础开发工具——vim篇

    🔥 博客主页: 小王又困了 📚 系列专栏: Linux 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、vim的基本概念  📒1.1命令模式 📒1.2插入模式 📒1.3底行模式 二、vim的基本操作 📒2.1进入vim 📒2.2模式转换 📒2.3退出vim 三、命令模式命令集 📒

    2024年02月05日
    浏览(32)
  • 『Linux升级路』基础开发工具——gdb篇

    🔥 博客主页: 小王又困了 📚 系列专栏: Linux 🌟 人之为学,不日近则日退 ❤️ 感谢大家点赞👍收藏⭐评论 ✍️ 目录 一、背景知识介绍 二、gdb指令介绍      在软件开发中,通常会有两种主要的构建配置:Debug(调试)和Release(发布)。这两种配置的存在是为了在不同

    2024年02月04日
    浏览(30)
  • 『Linux升级路』基础开发工具——make/Makefile篇

    🔥 博客主页: 小王又困了 📚 系列专栏: Linux 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、认识make/Makefile 📒1.1make/Makefile的优点 📒1.2make/Makefile的使用 二、依赖关系和依赖方法 📒2.1依赖关系 📒2.2依赖方法 三、make工作原理 🗒️ 前言:

    2024年02月05日
    浏览(23)
  • 【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)

    (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是 Scort 🎓 🌍博客主页:张小姐的猫~江湖背景🌍 快上车🚘,握好方向盘跟我有一起打天下嘞! 送给自己的一句鸡汤🤔: 🔥集中起来的意志可以击穿顽石🔥 🙏作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 🎉🎉欢迎持续关注!🎉🎉

    2024年01月16日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包