返回顶部
首页 > 资讯 > 操作系统 >【Linux】基础开发工具使用 --- gcc
  • 608
分享到

【Linux】基础开发工具使用 --- gcc

linux运维服务器 2023-09-09 13:09:26 608人浏览 安东尼
摘要

目录 预处理 编译 汇编 链接 函数库 协助记忆 🧋GCC(GNU Compiler Collection)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Jav

目录

预处理

编译

汇编

链接

函数库

协助记忆


🧋GCC(GNU Compiler Collection)是由GNU开发编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 FortranJavaAdaGo语言前端,也包括了这些语言的库(如libstdc++,libgcj等。),说那么多就是一个编译器。平时写完的程序就是需要编译之后才能运行。

🧋之前讲过程序的预处理,但之前限制于环境问题无法讲得透彻与直观。在 Linux 学习 gcc 后,我们终于可以清楚地观察到程序转换至可执行文件时的过程了。

🧋我们都知道,程序要尽量四个步骤才能转换成可执行文件,根据 gcc 的不同选项我们可以得到不同阶段下的文件。

预处理

gcc -E -o printf.i printf.c   //-o后跟着的始终为要生成的文件

🧋选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程,选项 “-o” 之后总是跟着生成的目标文件,输入这串命令,gcc 会自动将程序编译到相应的阶段,此时的文件后缀为  .i  

 🧋可以看到,注释的部分被删去,并且多出来八百多行的代码,就是源程序文件将头文件展开后的结果。

编译

gcc -S -o printf.s printf.i

🧋带上选项 "-S" , gcc 自动将文件编译到编译环节结束,此时的文件的内容已变成了汇编语言,同时文件的后缀为 .s

  1   .file "printf.c"                           2   .section  .rodata  3 .LC0:  4   .string "hello world"  5   .text  6   .globl  main  7   .type main, @function  8 main:  9 .LFB0: 10   .cfi_startproc 11   pushq %rbp 12   .cfi_def_cfa_offset 16 13   .cfi_offset 6, -16 14   movq  %rsp, %rbp 15   .cfi_def_cfa_reGISter 6 16   movl  $.LC0, %edi 17   call  puts 18   movl  $.LC0, %edi 19   call  puts 20   movl  $.LC0, %edi 21   call  puts 22   movl  $.LC0, %edi 23   call  puts 24   movl  $0, %eax 25   popq  %rbp 26   .cfi_def_cfa 7, 8 27   ret 28   .cfi_endproc 29 .LFE0: 30   .size main, .-main 31   .ident  "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)" 32   .section  .note.GNU-stack,"",@progbits

 汇编

gcc -c -o printf.o printf.s

🧋使用 “-c” 选项使文件编译到汇编结束停止,经过汇编后文件已由原来的汇编代码转换成二进制文件了(后缀为 .o ),直接看的话会发现就是一堆乱码。

🧋并且这个文件目前仍无法运行,若强制访问也会被拒绝。

[Alpaca@VM-12-9-Centos ~]$ ./printf.o-bash: ./printf.o: Permission denied

链接

gcc -o printf printf.o   //从.o文件开始编译gcc -o printf printf.c   //从头开始编译

🧋这一步结束后整个编译环节就算结束了,即从头到尾编译,因此不用带选项就能达到目的效果。生成的文件就可以直接执行了。

[Alpaca@VM-12-9-centos ~]$ ./printfhello worldhello worldhello worldhello world

函数库

🧋在链接的时候我们所用到的函数并不完全是我们自己的,因此需要与库建立联系,从而可以使用库里面的函数。

🧋函数库又分成了动态库静态库两种,动态库又叫共享库,其提供的能力是被所有人共享的,就像学校外的网吧一样,你给了钱就能上网,但万一有一天网吧倒闭了,所有的学生都不能去那家网吧上网了。

🧋而静态库则是将你所需要的库中的代码拷贝到自己本地的文件中。就像自己的电脑,即便外面的网吧倒闭了,你仍然可以照常上网

[Alpaca@VM-12-9-centos ~]$ ldd printflinux-vdso.so.1 =>  (0x00007ffdf3584000)libc.so.6 => /lib64/libc.so.6 (0x00007f1d8a320000)/lib64/ld-linux-x86-64.so.2 (0x00007f1d8a6ee000)[Alpaca@VM-12-9-centos ~]$ file printfprintf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ab832f77ec91a8a75cf4d749ef046741e5abf2bc, not stripped

🧋我们有两种方法来判断这个可执行文件是动态链接的还是静态链接的,第一就是使用 ldd 来查询函数的所属关系,当文件是 lib 开头后缀为 .so 则表明是依赖的是动态库,若后缀为 .a 则说明其依赖的是静态库。第二种方法就是使用 file 命令,可以细致地观察文件的属性,在这里便可以看到该文件是由动态库链接而成的。

gcc -static -o printf-static printf.c

🧋 Linux 下是默认使用动态链接的,但我们可以使用这个命令进行静态链接。之后查询出的文件的数据类型就表明其是由静态链接构成的了。

[Alpaca@VM-12-9-centos ~]$ file printf-staticprintf-static: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=9444d246f27ba1fed466fb, not stripped

🧋但由此我们可以明显地看出二者不同链接方式之间的区别,静态链接生成的文件所占的空间远大于动态链接的,更加地浪费空间。所以正常情况下还是使用动态链接较好。

[Alpaca@VM-12-9-centos ~]$ ll-rwxrwxr-x 1 Alpaca Alpaca   8361 Jan 11 21:54 printf-rwxrwxr-x 1 Alpaca Alpaca 861288 Jan 11 23:45 printf-static

协助记忆

🧋预处理、编译、汇编三个阶段所对应的选项分别是 “E” "S" "c" , 刚好就是键盘左上角那个 “Esc” ,只不过中间的 s 需要改成大写。同时其所对应的文件后缀为 “.i” 、“.s” 、“.o” 就是 “iso” 。只要稍微用一些方法来记忆之间的区别,相信很快就能熟练起来。

好了,这次gcc的介绍就到这里结束了,关注博主共同进步!!

来源地址:https://blog.csdn.net/Lin_Alpaca/article/details/128648508

--结束END--

本文标题: 【Linux】基础开发工具使用 --- gcc

本文链接: https://lsjlt.com/news/401509.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【Linux】基础开发工具使用 --- gcc
    目录 预处理 编译 汇编 链接 函数库 协助记忆 🧋GCC(GNU Compiler Collection)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Jav...
    99+
    2023-09-09
    linux 运维 服务器
  • 【Linux】环境基础开发工具使用(万字汇总)
    🎇Linux:环境基础开发工具使用 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话...
    99+
    2023-09-05
    linux 服务器 网络
  • 一文详细理解Linux的一些环境基础开发工具使用(一)
    前言:         本文章让大家理解Linux一些基础开发工具的使用,例如Linux如何下载一些软件,Linux如何进行编译代码,Linux怎么上传远程仓库等等,其实Linux工具本质也是命令!!  💞 &#...
    99+
    2023-08-31
    linux 运维 服务器
  • 【Linux】Linux开发工具(一)——vim工具
     作者:一个喜欢猫咪的的程序员  专栏:《Linux》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》 目录  1.什么是vim 1.1什...
    99+
    2023-09-04
    linux 运维 服务器
  • GCC编译工具怎么使用
    GCC是一款开源的编译器工具套件,可以用于编译C、C++、Objective-C等程序。下面是GCC编译工具的基本使用方法:1. 安...
    99+
    2023-09-12
    GCC
  • Linux gcc命令的具体使用
    01. 命令概述 gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。 gcc是GNU编译器套件(GNU Compiler Collectio...
    99+
    2022-06-04
    Linux gcc命令 Linux gcc
  • 基于node的cli工具开发使用详解
    目录前言背景功能特性效果预览插件开发使用实现原理使用到的工具package.jsonweb-cli.tsservice.tscreate.ts前言 如果文章对你有帮助的话,记得一键...
    99+
    2023-05-13
    node cli开发工具 node cli
  • 基于node的cli工具怎么开发使用
    本篇内容介绍了“基于node的cli工具怎么开发使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景公司内部有维护admin和h6两套基础...
    99+
    2023-07-05
  • nodejs开发使用哪些工具
    本篇内容介绍了“nodejs开发使用哪些工具”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • vue开发使用什么工具
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。vue开发工具1、BootstrapVue用于为 Vuejs 构建 Bootstrap 接口的开源库。链接https://bootstrap-vue.org/2、VueX...
    99+
    2023-05-14
    vue3
  • Linux开发工具和Windows开发工具对比的示例分析
    这篇文章给大家分享的是有关Linux开发工具和Windows开发工具对比的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux开发工具就C++开发工具而言,与Windows下微软(VC, VS2005...
    99+
    2023-06-16
  • Linux基础命令---host域名查询工具
    hosthost是一个常用的DNS查询工具,经常用来查询域名、检查域名解析是否正确。此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、Fedora。 1、语法host  [选项] ...
    99+
    2023-06-05
  • Linux基础命令---nslookup查询域名工具
    nslookupnslookup是一个查询DNS域名的工具,它有交互和非交互两种工作模式。此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、Fedora。 1、语法nslookup [-option]...
    99+
    2023-06-05
  • 小程序开发工具基础库更新了哪些内容
    本篇内容主要讲解“小程序开发工具基础库更新了哪些内容”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“小程序开发工具基础库更新了哪些内容”吧!最新版本 2017.03.29 (0.15.152900...
    99+
    2023-06-26
  • wireshark网络抓包工具基础使用教程
    目录  简介 WireShark软件安装 Wireshark 开始抓包示例 Wireshark过滤器设置 停止抓包 ​编辑保存数据 界面介绍 基础操作 1. 调整界面大小 2. 设置显示列 1)添加显示列 ​2)隐藏显示列 3)删除显示列 ...
    99+
    2023-08-31
    网络 wireshark 服务器
  • 嵌入式linux开发工具怎么用
    今天小编给大家分享一下嵌入式linux开发工具怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-03-19
    linux
  • C#开发工具SharpDevelop怎么使用
    使用SharpDevelop进行C#开发的步骤如下:1. 安装SharpDevelop:从官方网站(https://www.icsh...
    99+
    2023-09-29
    C# SharpDevelop
  • 使用Rust开发命令行工具
    生成二进制文件,将其扔到环境变量的path下即可~ 用rust打造实时天气命令行工具[1] 找到合适的API 使用该api[2] 如请求 api.openweathermap.org/da...
    99+
    2023-08-30
    后端
  • Linux基础命令---mysqladmin数据库管理工具
    mysqladminmysqladmin是mysql数据库的管理工具,可以控制、查看、修改数据库服务器的配置和状态。此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、Fedora。 1、语法mysqladmin...
    99+
    2023-06-05
  • Linux内核开发工具具体有哪些
    Linux内核开发工具具体有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。进行嵌入式Linux产品开发,往往需要对内核进行裁剪和定制,以满足嵌入式产品的功能...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作