【linux学习指南】Linux编译器 gcc和g++使用

2024-09-08 10:20

本文主要是介绍【linux学习指南】Linux编译器 gcc和g++使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请添加图片描述

文章目录

  • 📝前言
  • 🌠 gcc如何完成
    • 🌉预处理(进行宏替换)
  • 🌠编译(生成汇编)
    • 🌉汇编(生成机器可识别代码)
  • 🌠链接(生成可执行文件或库文件)
    • 🌉函数库
  • 🌠gcc选项
  • 🚩总结


📝前言

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)

🌠 gcc如何完成

格式 :gcc [选项] 要编译的文件 [选项] [目标文件]

🌉预处理(进行宏替换)

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

预处理文件包含:
在这里插入图片描述

在这里插入图片描述

🌠编译(生成汇编)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例:

gcc –S hello.i –o hello.s

生成汇编代码:
在这里插入图片描述

🌉汇编(生成机器可识别代码)

汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o

在这里插入图片描述

🌠链接(生成可执行文件或库文件)

在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello
在这里插入图片描述

🌉函数库

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

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

动态库: .so (linux).dll(windows)
静态库: .a (linux).lib

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

ldd 命令用于显示一个可执行文件或共享库所依赖的共享库列表。
在这里插入图片描述

  1. linux-vdso.so.1

    • 这是一个虚拟动态共享对象(VDSO),用于提供一些内核功能的用户空间接口。它通常用于提高系统调用的效率。
  2. libc.so.6

    • 这是标准 C 库(glibc)的共享库,提供了 C 语言的基本功能和系统调用接口。它的路径是 /lib64/libc.so.6,并且它在内存中的加载地址是 0x00007f11a5172000
  3. /lib64/ld-linux-x86-64.so.2

    • 这是动态链接器(或加载器),负责在程序运行时加载所需的共享库并进行链接。它的加载地址是 0x00007f11a5540000

函数库一般分为静态库和动态库两种。

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也
就不再需要库文件了。其后缀名一般为“.a

[wks@hcss-ecs-ab43 ~]$ ls /lib64/libc.a*
/lib64/libc.a
[wks@hcss-ecs-ab43 ~]$ ls /lib64/libc.a -al
-rw-r--r-- 1 root root 5105516 Jun  4 23:05 /lib64/libc.a
[wks@hcss-ecs-ab43 ~]$

这是要求gcc必须进行静态连接,连接对应的静态库在这里插入图片描述

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时
链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态
库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。

 gcc hello.o –o hello

动态库 :一旦动态库缺失,所有程序都无法运行,但比较节省资源可执行程序体积小

gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。

云服务器默认没有安装C/C++的静态标准库
sudo yum install -y glibc-static
sudo yum install -y libstdc+±static

🌠gcc选项

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

🚩总结

gccg++ 是 GNU Compiler Collection (GCC) 中的两个编译器,分别用于编译 C 和 C++ 语言的源代码。
主要区别如下:

  1. 语言支持
  • gcc:主要用于编译 C 语言程序。虽然它也可以编译 C++ 代码,但在处理 C++ 特有的语法和特性时,可能会出现问题。
  • g++:专门用于编译 C++ 语言程序。它能够正确处理 C++ 的语法、特性和标准库。
  1. 默认链接
  • gcc:在编译 C 代码时,默认链接 C 标准库。
  • g++:在编译 C++ 代码时,默认链接 C++ 标准库(如 libstdc++),这对于使用 C++ 标准库的程序是必要的。
  1. 文件扩展名
  • 使用 gcc 编译的源文件通常是 .c 文件,而使用 g++ 编译的源文件通常是 .cpp.cc 文件。
  1. 编译命令
  • 编译 C 代码示例:
    gcc -o my_program my_program.c
    
  • 编译 C++ 代码示例:
    g++ -o my_program my_program.cpp
    
  1. 处理 C++ 特性
  • g++ 能够处理 C++ 的特性,如类、模板、异常处理等,而 gcc 在处理这些特性时可能会出现错误或警告。

请添加图片描述

这篇关于【linux学习指南】Linux编译器 gcc和g++使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147843

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma