【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 的核…

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/…

C++ 音视频流媒体浅谈

C流媒体开发 今天就浅浅聊一下C流媒体开发 流媒体开发中最常见的是FFmpeg&#xff08;编解码器&#xff09; 业务逻辑主要是播放器了&#xff08;如腾旭视频 爱奇艺等等&#xff09; FFmpeg是一个开源的音视频处理工具集&#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美赛】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…

基于VMware和Unbuntu18.04编译 嘉立创·泰山派 Linux SDK

主机硬件要求 内存最少32G 硬盘腾出200-500G&#xff0c;虽然编译最终占了73G&#xff0c;但富余一些以后可以搞别的方便 操作系统win7/10/11 VMware 安装 1.去vmware官网下载&#xff1a;https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_comp…

小红书种草商品笔记违规,有哪些原因?

发布小红书笔记之后迟迟没有流量&#xff0c;内容过关但是浏览量突然变低是什么原因?如果出现上述情况&#xff0c;就可能是商品笔记被限制了。那么该如何重新获得流量呢?今天我们就来分享下小红书种草商品笔记违规&#xff0c;有哪些原因&#xff1f; 一、怎样判断被限流了 …

网络原理-TCP/IP(4)

TCP原理 滑动窗口 之前我们讲过了确认应答策略,对发送的每一个数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段. 确认应答,超时重传,连接管理这样的特性都是为了保证可靠运输,但就是付出了传输效率(单位时间能传输数据的多少)的代价,因为确认应答机制导致了时间大…

Qt实现类似ToDesk顶层窗口 不规则按钮

先看效果&#xff1a; 在进行多进程开发时&#xff0c;可能会遇到需要进行全局弹窗的需求。 因为平时会使用ToDesk进行远程桌面控制&#xff0c;在电脑被控时&#xff0c;ToDesk会在右下角进行一个顶层窗口的提示&#xff0c;效果如下&#xff1a; 其实要实现顶层窗口&#xf…

计算机设计大赛 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

力扣hot100 对称二叉树 递归

Problem: 101. 对称二叉树 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考 Code 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* …

深入解剖指针篇(3)

个人主页&#xff08;找往期文章&#xff09; &#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 二级指针 指针数组 指针数组模拟二维数组 字符指针变量 数组指针 数组指针初始化 二维数组传参的本质 函数指针 函数指针的使用 typedef关键字 函数指针数组 二级指针…

缓存击穿,商详页进不去了!!!

故事 对于小猫来讲&#xff0c;最近的一段日子是不好过的&#xff0c;纵使听着再有节拍的音乐&#xff0c;也换不起他对生活的热情。由于上一次“幂等事件”躺枪&#xff0c;他已经有几天没有休息好了。他感觉人生到了低谷。 当接手这个商城项目之后&#xff0c;他感觉他一直没…

视频怎么加水印?分享两个简单的加水印的方法

在数字媒体时代&#xff0c;视频已经成为信息传播的重要方式。许多人在创作视频是会加上自己独特的水印&#xff0c;防止视频被盗用。水印作为数字版权保护技术的一种&#xff0c;可以有效地防止视频被非法复制、传播或篡改&#xff0c;从而保护创作者的权益和利益。下面我分享…