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

news2024/10/7 3:28:11

💗个人主页💗
⭐个人专栏——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 project
        linux-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.coloradmin.cn/o/1428037.html

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

相关文章

【Python】一个简单的小案例:实现批量修改图片格式

1.代码 import os from tkinter import Tk, Button from PIL import Imagedef check_and_create_folders():# 获取当前目录current_directory os.getcwd()# 定义文件夹名称folders_to_check ["JPG", "PNG"]for folder_name in folders_to_check:folder_…

Java/Python/Go不同开发语言基础数据结构和相关操作总结-Map篇

Java/Python/Go不同开发语言基础数据结构和相关操作总结 1. Java1.1 基础操作1.1.1 数据结构和定义方式1.1.2 增加1.1.3 修改1.1.4 查询1.1.5 删除1.1.6 获取总长度1.1.7 按key排序1.1.8 按value排序1.1.9 遍历 1.2 常用其他方法1.2.1 几种数据结构的对比 2. Go2.1基础操作2.1.…

代码随想录算法训练营第二十四天| 77. 组合。

77. 组合 题目链接:组合 题目描述: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 解题思路: 本题是经典的回溯法解决的组合问题,回溯问题搞清楚纵向递归横向遍历即…

Redis核心技术与实战【学习笔记】 - 12.Redis删除数据后,为什么内存占用率还是很高?

前言 在使用 Redis 是,经常会遇到一个问题:明明做了数据删除,数据量不大,但是 使用 top 命令查看时,发现 Redis 还是占用了很多内存。 这是因为,当删除数据后,Redis 释放的内存空间会由内存分…

Vivado编译介绍

Vivado编译介绍 合成是将寄存器传输级别(RTL)指定的设计转换为门级表示。AMD Vivado™ 合成是定时驱动的,并针对内存进行优化使用和性能。Vivado合成支持以下的可合成子集: •SystemVerilog:IEEE标准SystemVerilog统…

UniMSE: Towards Unified Multimodal Sentiment Analysis and Emotion Recognition

文章目录 UniMSE:实现统一的多模态情感分析和情绪识别文章信息研究目的研究内容研究方法1.总体架构2.Task Formalization3.Pre-trained Modality Fusion (PMF)4.Inter-modality Contrastive Learning5.总体损失函数6.Decoding Algorithm 结果与讨论代码和数据集符号…

博客网站系统测试报告

一、项目背景 博客网站系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有个页面构成:注册页、登录页、个人博客列表页、博客详情页、编辑博客页、修改博客页以及博客系统主页&#xf…

【项目实践02】【优先级阻塞队列】

文章目录 一、前言二、项目背景三、实现方案四、思路延伸1. 优先级队列1.1 concurrent 包下的 PriorityBlockingQueue1.2 Redisson 的优先级阻塞队列 2. jvisualvm 远程连接3. Jstack 高 CPU 排查 五、参考内容 一、前言 本系列用来记录一些在实际项目中的小东西,并…

【算法分析与设计】交换两个节点

📝个人主页:五敷有你 🔥系列专栏:算法分析与设计 ⛺️稳中求进,晒太阳 题目 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本…

实习日志11

1.文件上传报错 1.1.报错信息Invalid typed array length: -2 1.2.查看源码找出错误 定位到检查代码上传是否成功的代码出错,rDataArr[3] 0x03 var pData new Uint8Array(pDataLen);的pDataLen4 说明rDataArr只有0-3,其他数据都没有上传上来 说明…

DoubleEnsemble:基于样本重加权和特征选择的金融数据分析方法

现代机器学习模型(如深度神经网络和梯度提升决策树)由于其提取复杂非线性模式的优越能力,在金融市场预测中越来越受欢迎。然而,由于金融数据集的信噪比非常低,并且是非平稳的,复杂的模型往往很容易过拟合。…

leetcode189.轮转数组|超简单易于理解方法

题目 https://leetcode.cn/problems/rotate-array/description/https://leetcode.cn/problems/rotate-array/description/ 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输…

基于uniapp+vue酒店宾馆客房民宿管理系统设计 微信小程序_54ybz

APP性能需求 (1)顾客在安卓APP页面各种操作可及时得到反馈。 (2)该平台是提供给多个用户使用的平台,用户使用之前需要注册登录。登录验证后,用户才可进行各种操作[10]。 (3)管理员、…

Java 集合 04 综合练习-查找用户是否存在

练习、 代码: public class User{private String id;private String username;private int password;public User() {}public User(String id, String username, int password) {this.id id;this.username username;this.password password;}public String getI…

舟山长寿医学中心:引领生命科技前沿

在浩瀚的东海之滨,舟山群岛如一颗璀璨的明珠,镶嵌在碧波荡漾的大海之中。这里不仅拥有得天独厚的自然美景,更是一块充满生机与活力的健康宝地。舟山长寿医学中心,正是这片神奇的土地上的一颗璀璨明珠,致力于为全球人士…

Linux权限【上篇】

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 扩展知识&#xff1a…

react 之 UseReducer

UseReducer作用: 让 React 管理多个相对关联的状态数据 import { useReducer } from react// 1. 定义reducer函数,根据不同的action返回不同的新状态 function reducer(state, action) {switch (action.type) {case INC:return state 1case DEC:return state - 1de…

系统移植--无法启动Linux内核--报错VFS--挂载nfs失败

问题 找信息:VFS 可能的原因 1、开发板上内核启动参数中的虚拟机ubuntu IP和真实的 虚拟机的IP不一致 2、开发板上内核启动参数中虚拟机的共享目录和虚拟机 ubuntu上配置的nfs服务器上的共享目录不一致 3、nfs配置文件(/etc/exports)路径错误 与自己的共享文件…

Galah:一款功能强大的LLM驱动型OpenAI Web蜜罐系统

关于Galah Galah是一款功能强大的Web蜜罐,该工具由LLM大语言模型驱动,基于OpenAI API实现其功能。 很多传统的蜜罐系统会模拟一种包含了大量网络应用程序的网络系统,但这种方法非常繁琐,而且有其固有的局限性。Galah则不同&…

Transformer 自然语言处理(四)

原文:Natural Language Processing with Transformers 译者:飞龙 协议:CC BY-NC-SA 4.0 第十章:从头开始训练变换器 在本书的开头段落中,我们提到了一个名为 GitHub Copilot 的复杂应用,它使用类似 GPT 的…