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

这篇具有很好参考价值的文章主要介绍了【Linux】基础开发工具使用 --- gcc。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

预处理

编译

汇编

链接

函数库

协助记忆


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

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

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

预处理

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

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

gcc命令需要使用命令行开发者工具,Linux,linux,运维,服务器

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

编译

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 ),直接看的话会发现就是一堆乱码。

gcc命令需要使用命令行开发者工具,Linux,linux,运维,服务器

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

[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 ~]$ ./printf
hello world
hello world
hello world
hello world

函数库

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

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

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

[Alpaca@VM-12-9-centos ~]$ ldd printf
	linux-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 printf
printf: 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-static
printf-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://www.toymoban.com/news/detail-778081.html

到了这里,关于【Linux】基础开发工具使用 --- gcc的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】环境基础开发工具使用——gcc/g++使用

    1. 预处理(进行宏替换 ) 2. 编译(生成汇编 ) 3. 汇编(生成机器可识别代码) 4. 连接(生成可执行文件或库文件 ) 格式 gcc [ 选项 ] 要编译的文件 [ 选项 ] [ 目标文件 ] 预处理 ( 进行宏替换 ) 预处理功能主要包括宏定义 , 文件包含 , 条件编译 , 去注释等。 预处理指令是以 # 号

    2024年04月09日
    浏览(51)
  • 【Linux升级之路】2_Linux环境基础开发工具使用

    🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux升级之路】 ✒️✒️本篇内容:Linux工具学前常识,Linux编辑器vim的使用,sudo提权指令讲解/配置,Linux编译器gcc/g++的使用,项目自动化构建工具make/makefile的使用,工具实践(小程序-进度条),Linux环境下git的使用

    2023年04月14日
    浏览(35)
  • Linux:基础开发工具之yum,vim,gcc的使用

    本篇主要总结的是Linux下开发工具 yum vim gcc/g++ 什么是yum? 不管是在手机移动端还是 pc 端,不管是什么操作系统,当用户想要下载一些内容或者工具的时候,都需要到一个特定的位置进行下载,例如在手机上,要下载一些应用的时候就可以去对应的应用商店下载 而在Linux系统

    2024年02月08日
    浏览(49)
  • 【Linux基础开发工具】yum生态&&vim的配置与使用

    目录 前言  1. Linux 软件包管理器 yum   1.1 什么是yum  1.2 快速上手yum  1.3 yum生态 2. Linux编辑器vim 2.1 vim的模式 2.2 vim使用技巧 3. vim编辑器辅助功能配置 3.1 配置  3.2 用户sudo权限配置  总结         Linux基础指令与权限之后,Linux系统开发工具的使用也至关重要,今天我将分享

    2024年02月04日
    浏览(41)
  • Linux之基础开发工具gdb调试器的使用(三)

    📘北尘_ :个人主页 🌎个人专栏 :《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 yum install -y gdb 程序的发布方式有两种,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式,release模式下无法调试 要使用gd

    2024年02月05日
    浏览(47)
  • Linux基础环境开发工具的使用(yum,vim,gcc,g++)

    首先先说明一点: Centos系统适用于yum 而Ubanto适用于apt-get 在Linux中我们也要进行工具/程序/指令的安装,检查和卸载, 而我们安装软件的方式: 1.源代码安装-需要进行交叉编译的工作 一般那些很强的程序员中的大佬才能拿捏 2.rpm包直接安装,也很麻烦 3.yum直接安装 这就需要用到y

    2024年02月06日
    浏览(43)
  • 【探索Linux】—— 强大的命令行工具 P.3(Linux开发工具 vim)

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也相信大家都掌握的不错,今天博主带大家了解一下Linux开发工具—— vim ,下面话不多说坐稳扶好咱们要开车了!!!😍 Vim(Vi IMproved)是一款在Unix和类

    2024年02月12日
    浏览(41)
  • 【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)

    (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是 Scort 🎓 🌍博客主页:张小姐的猫~江湖背景🌍 快上车🚘,握好方向盘跟我有一起打天下嘞! 送给自己的一句鸡汤🤔: 🔥集中起来的意志可以击穿顽石🔥 🙏作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 🎉🎉欢迎持续关注!🎉🎉

    2024年01月16日
    浏览(50)
  • 【Linux】基础开发工具——make

    上一期分享了在Linux下编译源代码的两个工具,gcc和g++。每次编译源代码,都要输入一串很长的指令,这个过程显然是十分复杂,且容易出错的,尤其是在一些大型的项目中,源代码可能有多个,此时编译起来就会更费劲。为了解决上面的问题,今天就给大家分享一个,Linu

    2024年02月16日
    浏览(34)
  • 【Linux】基础开发工具——vim篇

    前言:  今天给大家分享的工具是 vim 。vim是一款强大的 文本编辑器 ,他有多种编辑模式,所以也叫 多模式编辑器 ,它的前身是vi。vim兼容vi的所有指令,并且在vi的基础上添加了一些新的特性。例如:语法加亮、可视化操作也可以运行在x windows、mac os、windows。  先给大家

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包