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

💗个人主页💗
⭐个人专栏——Linux学习⭐
💫点击关注🤩一起学习C语言💯💫

目录

  • 导读
  • 1. Linux编译器-gcc/g++使用
    • 1.1 引入
    • 1.2 初识gcc/g++
    • 1.3 程序运行的四个阶段
      • 1.3.1 预处理
      • 1.3.2 编译
      • 1.3.3 汇编
      • 1.3.4 链接
    • 1.4 gcc的选项用法
  • 2. 函数库
    • 2.1 引入
    • 2.2 函数库分类
    • 2.3 动态库
    • 2.4 静态库

导读

我们上次讲到yum命令和vim指令的运用,今天我们来讲一下gcc,

1. Linux编译器-gcc/g++使用

1.1 引入

我们在之前,也在Linux里写过C语言的代码,之后gcc加文件名运行之后,在运行./a.out.

[zhy@centos7 ~]$ vim project.c
[zhy@centos7 ~]$ gcc project.c
[zhy@centos7 ~]$ ./a.out
功能2
功能3
功能4

在这里插入图片描述

1.2 初识gcc/g++

在Linux中,gcc和g++是常用的编译器,分别用于编译C和C++程序。

gcc是GNU Compiler Collection的缩写,是一个开源的编译器集合,支持多种编程语言,包括C、C++、Objective-C、Fortran等。因此,gcc可用于编译C、C++等多种语言的程序。它可以把C++源代码交给g++编译器处理,也可以处理其他语言的源代码。

g++是gcc的一个衍生版,专门用于编译C++程序。它是gcc的C++编译器前端,对于C++语言的特性和标准库提供更好的支持。相比于gcc,g++对C++的语法和特性更加敏感和严格。

编译C程序:

  1. 编写C代码(例如,将代码保存为hello.c)。

  2. 打开终端,并切换到保存C代码的目录。

  3. 使用以下命令编译C代码:

[zhy@centos7 ~]$ gcc -o project project.c

该命令将使用gcc编译器将project.c源文件编译为可执行文件project。
4. 运行可执行文件:

[zhy@centos7 ~]$ ./project

在这里插入图片描述
编写C++程序同理,知识命令从gcc变为g++。
那么,他们都经历过什么步骤呢?

1.3 程序运行的四个阶段

一般gcc会默认执行四个步骤:预处理、编译、汇编、链接。

1.3.1 预处理

预处理阶段通过预处理器(如gcc、g++)对源代码进行处理。
主要包括:

  1. 宏替换
  2. 头文件包含
  3. 条件编译
  4. 去除注释

预处理器根据预处理指令(以#开头)对源代码进行修改和展开,生成经过预处理后的新代码。
运行以下命令:

[zhy@centos7 ~]$ gcc -E project.c -o project.i

将会生成一个project.i的文件,里面是源文件经过预处理之后的代码。

选项 -E:该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项 -o:是指目标文件,.i为后缀的文件为已经过预处理的C原始程序。

在这里插入图片描述
在这里插入图片描述

1.3.2 编译

编译阶段将预处理后的代码编译为汇编代码。
编译器经过**词法分析语法分析语义分析、以及之后的优化**将源代码翻译成汇编语言,生成汇编代码(以汇编语言表示的低级指令)。

[zhy@centos7 ~]$ gcc -S project.i -o project.s

将会生成一个project.s的文件,里面存入的是汇编代码。

选项-S:该选项只进行编译而不进行汇编,生成汇编代码。

在这里插入图片描述

1.3.3 汇编

汇编阶段将汇编代码转换成机器码指令。

汇编器(如gcc、nasm)将汇编代码转换为可执行的机器指令,也就是二进制码。每个汇编语句都直接对应于一条机器指令。

[zhy@centos7 ~]$ gcc -c project.s -o project.o

我们发现,这个生成的.o文件,为何打开是乱码?
在这里插入图片描述
.o后缀文件是编译阶段生成的目标文件,它包含汇编代码和符号信息,不是可执行文件,我们可以使用objdump命令,这个命令是GNU Binutils工具集中的一个工具,可以用来查看目标文件的内容。

[zhy@centos7 ~]$ objdump -d project.o

在这里插入图片描述
显示.o文件中的反汇编代码,以及对应的机器指令。

1.3.4 链接

链接阶段将多个目标文件和库文件合并在一起,生成最终的可执行文件。

链接器(如ld、gcc、g++)解决了不同目标文件之间的符号引用关系,将这些目标文件以及所需的库文件合并在一起,生成可执行文件。在此阶段,还进行了地址重定位、符号解析等操作。

也就是我们上述执行过的一个命令,为了再次演示,我们先把之前生成的执行文件删除,然后再次执行。

[zhy@centos7 ~]$ rm -f project
[zhy@centos7 ~]$ gcc -o project project.c
[zhy@centos7 ~]$ ./project

在这里插入图片描述

1.4 gcc的选项用法

我们上面通过一些选项,选择让gcc生成我们所需要的文件,那么gcc还有些什么功能选项呢。

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

2. 函数库

2.1 引入

在上面的程序中,涉及到了一个重要的概念:函数库

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

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

2.2 函数库分类

在Linux中,函数库是一组预编译的代码,提供了许多可重用的函数和工具,可以帮助开发人员更快速地构建和开发应用程序。

以下是Linux中常见的几种函数库:

  1. 标准C函数库(libc):这是Linux系统中最基本的函数库,提供了C语言标准函数的实现。它包含了对文件操作、字符串处理、内存管理、数学运算等常用功能的支持。以glibc(GNU C Library)为例,它是Linux系统中最常用的C函数库。

  2. 动态链接库(shared library):动态链接库是一种可以在运行时加载的共享库,提供了一组函数和符号供应用程序使用。动态链接库以 .so(shared object)为文件后缀。常见的动态链接库包括 libm(数学库)、libpthread(线程库)等。它们在编译时不会被静态地链接到可执行文件,而是在运行时动态加载。

  3. 静态链接库(static library):静态链接库是一组在编译时被静态地链接到可执行文件的函数和符号。静态链接库以 .a(archive)为文件后缀。静态链接库可以包含多个目标文件,可以通过 ar 命令创建和管理。

  4. POSIX函数库:POSIX(Portable Operating System Interface)函数库是一组用于支持Unix/Linux标准接口的函数库,涵盖了文件操作、进程管理、信号处理、线程等方面的功能。常见的POSIX函数库包括 libpthread(线程库)、libdl(动态加载库)等。

当然还有其他的函数库,今天我们主要来学习动态库和静态库。
需要注意的是,当静态库和动态库都存在时,编译器优先选择动态库进行链接。
如果希望强制使用静态库进行链接,可以使用 -static 参数。

2.3 动态库

动态库是一组在运行时加载的共享库,它与可执行文件是分离的。动态库的扩展名通常是.so(shared object)。
💫使用方式💫

  • 在编译时,可以使用 -l 和 -L 参数来指定需要链接的动态库及其位置。例如:-lmylib 表示链接名为 libmylib.so 的动态库。
  • 在运行时,系统会自动查找并加载程序所需要的动态库。

💫ldd命令💫

ldd命令是在Linux系统中用于检查可执行文件或共享库所依赖的动态链接库的工具。它可以显示出一个可执行文件或共享库所需的动态链接库列表。

[zhy@centos7 ~]$ which ldd
/usr/bin/ldd
[zhy@centos7 ~]$ ldd projectlinux-vdso.so.1 =>  (0x00007ffc30ba0000)libc.so.6 => /lib64/libc.so.6 (0x00007fe4e8e59000)/lib64/ld-linux-x86-64.so.2 (0x00007fe4e9227000)

💫优势💫

动态库可以在多个程序之间共享,减少了内存占用和可执行文件的体积。如果对动态库进行更新,所有使用该库的程序都可以受益。

2.4 静态库

静态库是一组在编译时被静态地链接到可执行文件的函数和符号。静态库的扩展名通常是 .a(archive)。
💫使用方式💫
在编译时使用 -l 和 -L 参数来指定需要链接的静态库及其位置。例如:-lmylib 表示链接名为 libmylib.a 的静态库。

与动态库不同的是:C和C++静态库需要我们自己去安装。

sudo yum install -y glibc-static
sudo yum install -y libstdc++-static

💫优势💫
静态库在编译时会被完整地复制到可执行文件中,使得可执行文件成为一个独立的单元,不依赖于外部库文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2024.2.1练习】岛屿个数(15分)

题目描述 题目思路 题目乍一看类似于“水坑个数问题”,是对陆地块进行DFS,上下左右4个方向分别对应了四种状态转移,每块陆地进行搜索后变成海洋,最终搜索次数就是岛屿个数。 但在子岛屿存在的情况下,需要先对海洋块进行DFS,由于…

binder android

文心一言的回答 Binder驱动是Android操作系统中用于进程间通信(IPC)的机制。它提供了一种高效、跨进程的数据传输方式,使得应用程序的不同组件可以在Android系统上互相通信。 Binder驱动基于Linux内核,其核心组件是一个称为Bind…

基于最新koa的Node.js后端API架构与MVC模式

Koa 是一个由 Express 原班人马打造的现代 Web 框架,用于 Node.js。它旨在提供一个更小、更富有表现力和更强大的基础,用于 Web 应用和 API 开发。Koa 不捆绑任何中间件,它提供了一个优雅的方法以组合不同的中间件来处理请求和响应。 Koa 的核…

TypeScript中的泛型

前言 TypeScript想必大家也很熟了,今天主要介绍一下TS中的泛型,泛型也是一种强大的工具,它是可以在定义函数、类和接口时使用参数化类型,使得这些实体可以适用于多种数据类型而不失类型安全性。泛型的引入让开发者能够编写更加灵…

2024年哪款便签软件是手机电脑同步的?

在繁忙的生活、工作和学习中,我们时常面临各种琐事和任务,需要随时记录、提醒,以保持高效的生活节奏。比如,突然想到的灵感、重要的工作计划、紧急的购物清单,都需要一个便利的便签工具来随手记录。特别是在多终端使用…

vue2 el-form 两个时间框(第一个时间框是只能选择当前时间,之前的是不允许选择,第二个时间框是第一个时间的当前的时间后30天后可以选择的)

<template><div id"app"><el-form :model"form"><el-form-item label"预签时间"><el-date-picker v-model"form.t2" type"date" placeholder"选择预签时间" changepreSigning/><…

RT-DETR算法优化改进:上采样算子 | 超轻量高效动态上采样DySample,效果秒杀CAFFE,助力小目标检测

💡💡💡本文独家改进:一种超轻量高效动态上采样DySample, 具有更少的参数、FLOPs,效果秒杀CAFFE和YOLOv8网络中的nn.Upsample 💡💡💡在多个数据集下验证能够涨点,尤其在小目标检测领域涨点显著。 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/…

HTTP传输文件和FTP传输文件的相关简介

服务器数据安全一直以来是网络工作中的重中之重&#xff0c;服务器文件传输方式也是需要重视的一方面。而服务器传输文件的方式有很多&#xff0c;比如HTTP传输、FTP传输、BT传输、SFTP传输等等。今天就简单来介绍下HTTP传输文件和FTP传输文件的相关特点。 HTTP传输是一种常见…

C++ 音视频流媒体浅谈

C流媒体开发 今天就浅浅聊一下C流媒体开发 流媒体开发中最常见的是FFmpeg&#xff08;编解码器&#xff09; 业务逻辑主要是播放器了&#xff08;如腾旭视频 爱奇艺等等&#xff09; FFmpeg是一个开源的音视频处理工具集&#xff0c;可以用于处理、转换和流媒体传输音视频…

「HarmonyOS」EventHub事件通知详细使用方法

需求背景&#xff1a; 在开发过程中&#xff0c;肯定会出现触发特定事件&#xff0c;需要全局进行通知&#xff0c;与之相关的部分进行执行相应的修改方法。举个例子&#xff1a;修改了用户个人昵称&#xff0c;需要进行全局通知&#xff0c;在涉及昵称的部分收到通知后&#…

Hive核心优化

数据采样 分桶表概述: 分桶就是分文件, 在创建表的时候, 指定分桶字段, 并设置分多少个桶, 在添加数据的时候, hive会根据设置分桶字段, 将数据划分到N个桶(文件)中, 默认情况采用HASH分桶方案 , 分多少个桶, 取决于建表的时候, 设置分桶数量, 分了多少个桶最终翻译的MR也就会运…

机器翻译在各领域的应用

你知道机器翻译有哪些应用领域吗&#xff1f; ​​机器翻译在多个领域都有应用场景&#xff0c;最常见的是商业领域。​机器翻译在商业领域中的应用如下&#xff1a; ​ 产品说明书&#xff1a;通过机器翻译&#xff0c;用户可以快速获取产品说明书中的内容&#xff0c;提高…

广州标点医药信息-米内网数据及咨询服务企业全方位解析!

米内网&#xff08;MENET&#xff09;原名中国医药经济信息网&#xff0c;由广州标点医药信息股份有限公司主办&#xff0c;2010年10月28日更名为“米内网”&#xff0c;上线初始主打医药销售数据库&#xff0c;经过十余年的迭代发展&#xff0c;现已成为国内主要的医药健康信息…

计网——应用层

应用层 应用层协议原理 网络应用的体系结构 客户-服务器&#xff08;C/S&#xff09;体系结构 对等体&#xff08;P2P&#xff09;体系结构 C/S和P2P体系结构的混合体 客户-服务器&#xff08;C/S&#xff09;体系结构 服务器 服务器是一台一直运行的主机&#xff0c;需…

数据结构·复杂度讲解

1. 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 数据结构是用来在内存中管理数据的&#xff0c;类似的&#xff0c;我们熟悉的文件或数据库是在硬盘中管理数据的。内存中的数据是带点…

2024美赛数学建模所有题目思路分析

美赛思路已更新&#xff0c;关注后可以获取更多思路。并且领取资料 C题思路 首先&#xff0c;我们要理解势头是什么。简单来说&#xff0c;势头是一方在比赛中因一系列事件而获得的动力或优势。在网球中&#xff0c;这可能意味着连续赢得几个球&#xff0c;或是在比赛的某个关…

【2024美赛】B题(中英文):搜寻潜水器Problem B: Searching for Submersibles

【2024美赛】B题&#xff08;中英文&#xff09;&#xff1a;搜寻潜水器Problem B: Searching for Submersibles 写在最前面2024美赛翻译 —— 跳转链接 中文赛题问题B&#xff1a;搜寻潜水器你的任务是&#xff1a; 词汇表 英文赛题Problem B: Searching for SubmersiblesYour…

AI:122-基于深度学习的电影场景生成与特效应用

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

详解 Prim 算法的实现

一、算法思路 Prim 算法是用来求最小生成树的&#xff0c;它的思想也有点类似于贪心——逐个将离当前集合最近的点加入到集合中&#xff0c;直至发现图不连通或所有点都被加到集合中&#xff0c;算法即宣告终止。它的具体做法是&#xff1a; step 1&#xff1a;初始时&#xf…

el-tree setChecked实现父子不联动

2024.1.29今天我学习了如何使用el-tree的setChecked用法&#xff0c;在使用el-tree的时候我们需要进行回显情况&#xff1a;如&#xff1a; [{id:1,name:张三, children:[{id:1-1,name:张三四},{id:1-2,name:张三五}]}, {id:2,name:李四}] 如果我们存id&#xff1a; [1,2]&a…