Linux开发工具:gcc和g++

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

目录

一. 什么是gcc和g++

二. gcc的基本使用方法

三. 库和链接

3.1 动态库和静态库

3.2 动态链接和静态链接

四. Debug和Release

五. makefile和make

六. 总结 


一. 什么是gcc和g++

  • gcc:Linux下编译C语言程序的编译器
  • g++:Linux下编译C++代码的编译器

由于C++兼容C语言,因此g++既可以编译C++也可以编译C语言。但是,一般建议使用gcc编译C语言,使用g++编译C++。

gcc和g++的使用方法完全一致,因此,本文以gcc为例讲解gcc/g++的使用方法。

二. gcc的基本使用方法

以mycode.c代码为例,生成可执行文件的一般指令为:

  • gcc mycode.c -std=c99

生成可执行文件的默认文件名为a.out,程序运行的指令为:./a.out

Linux开发工具:gcc和g++
图2.1 使用gcc编译C语言代码

如果我们希望自定义可执行文件的文件名,就需要用到-o选项:

  • -o选项:将生成的文件,输出重定向的特定文件

假设我们希望生成的可执行文件文件名为mytest,那么指令应为:gcc mycode.c -o mytest.txt -std=c99,通过ll指令,可以看到生mytest文件生成成功。

Linux开发工具:gcc和g++
图2.2 使用-o选项自定义可执行文件文件名

我们知道,源文件(.c/.cpp)到可执行程序,需要经过四个步骤(预编译、编译、汇编、链接),每一步完成的工作为:

  1. 预编译(预处理):头文件的包含、注释的删除、宏替换、条件编译,生成.i文件。
  2. 编译:将C/C++代码转换为对应汇编代码,生成,s文件。
  3. 汇编:将汇编代码转换为可识别的机器码(二进制指令)。
  4. 链接:将多个目标文件和链接库进行链接。

由可执行文件生成的四个步骤,引出gcc/g++的三个选项:

  • -E:从当前开始翻译,完成预处理就停止。
  • -S:从当前开始翻译,完成到编译就停止。
  • -c:从当前开始翻译,完成到汇编就停止。

通过指令gcc -E mycode.c -o mycode.i -std=c99,生成预处理后的文件mycode.i,用vim打开两份文件,可以看出所有的条件编译、注释、宏和头文件,均按规则进行了处理(见图2.3)

Linux开发工具:gcc和g++
图2.2 预处理完成后就停止
Linux开发工具:gcc和g++
图2.3 预处理前(右)后(左)的文件内容对比

通过gcc -S mycode.i -o mycode.s -std=c99,生成编译后的文件mycode.s,使用vim打开mycode.s文件,可以看到程序对应的汇编代码。

Linux开发工具:gcc和g++
图2.3 完成编译工作就停止
Linux开发工具:gcc和g++
图2.4 对mycode.i编译生成的汇编代码

通过指令gcc -c mycode.s -o mycode.o -std=c99,生成二进制的目标文件mycode.o,这里由于vim是文本编辑器,查看二进制文件mycode.o看到的会是乱码,可以使用od来查看二进制文件内容,od查看二进制文件指令为:od 二进制文件名

Linux开发工具:gcc和g++
图2.5 完成汇编工作就停止
Linux开发工具:gcc和g++
图2.6 使用od查看二进制文件

如果不使用-o、-i、-s选项中的任意一个,那么直接默认完成到链接工作,生成可执行文件。

可执行程序形成的时候,不是无序的二进制构造,而是遵循自己的格式 -- ELF格式。通过指令:readelf -S 可执行文件名可以查看可执行文件的二进制构成。

Linux开发工具:gcc和g++
图2.7 readelf查看可执行文件的二进制构成

三. 库和链接

3.1 动态库和静态库

链接,就是将汇编之后生成的二进制目标文件,与标准库进行链接。

库,本质上就是源文件(.c/.cpp)经过一定的翻译后进行打包后的文件,库有自己的路径。使用库可以达到隐藏源文件的目的, 库中提供函数方法的具体实现。

可以这样认为:头文件提供方法声明 + 库提供方法实现 + 用户代码 = 软件。

库,可分为动态库和静态库,在Window和Linux系统中,根据后缀名不同来区分动静态库:

  • 在Linux环境下:.so(动态库)、.a(静态库)
  • 在Windows环境下:.dll(动态库)、.lib(静态库)

库有自己的命名规则:libname.so.XXX,libname.a.XXX,其中库的实际名称只有中间name那一小部分,lib为前缀,.so.XXX/.a.XXX为后缀。

在Liunx系统中,库文件默认存储在路径/lib64/下使用指令ls /lib64/libc.so*和ls /lib64/libc.s*,可以分别查看C语言的动态库和静态库。

Linux开发工具:gcc和g++
图3.1 C语言动静态库的查看

Linux系统中,默认只有C/C++的动态库,没有静态库,静态库需要自行安装,安装方法为:

  • C语言静态库:yum install -y glibc-static
  • C++静态库:yum install -y libstdc++-static

3.2 动态链接和静态链接

  • 动态链接,就是在代码执行过程中,通过链接关系,让执行流跳转到库中去执行。
  • 静态链接,就是将库中的方法,拿到源文件调用库中方法的位置,执行流不会跳转到库的内部执行。

如果动态库缺失,那么涉及到动态库的所有程序,都不能正常运行。如果静态库缺失,方法的实现已经被提取到了可执行文件中,程序依旧能正常运行。

动态链接和静态链接各有其优缺点:

  • 动态链接可执行文件小,但如果动态库缺失,可能大范围造成程序不可运行
  • 静态链接静态库缺失不影响程序运行,安全性更高,但是可执行程序的占用空间会大幅膨胀。

在默认情况下,gcc采用动态链接的方式编译源文件,如果希望采用静态链接的方式编译代码,首先要保证静态库存在,然后显示声明选项-static, 即可执行静态链接。

  • gcc mycode.c -o mytest-static - std=c99 -static -- 采用静态链接方式编译mytest.c文件

如图3.2所示,分别采用动态链接和静态链接的方式,编译mycode.c源文件,生成可执行文件mytest和mytest-static,通过ll查看文件属性,看到采用静态链接的可执行文件占用空间明显大于采用动态链接的。

Linux开发工具:gcc和g++
图3.2 采用动态链接和静态链接的方法生成可执行文件

关于查看可执行程序的动静态链接情况,有以下两条指令:

  • file指令:查看可执行文件的动静态链接情况。
  • ldd指令:查看可执行文件动静态链接所依赖的动态库。
Linux开发工具:gcc和g++
图3.3 file和ldd指令查看

关于动静态库是否存在与动静态链接是否能够完成的关系,有下面三条规律:

  1. 如果静态库不存在,那么一定不能完成静态链接。
  2. 如果动态库不存在,静态库存在,gcc不使用-static选项,那么依旧能够生成可执行文件,只不过是以静态链接的方式生成的。
  3. 根据第1和第2条规律,如果gcc不使用-static选项,那么可执行文件可能是动态链接和静态链接并存的。 

四. Debug和Release

Debug为调试版本,以Debug版本发布的可执行程序,会带有调试信息。Release为发布版本,以Release版本发布的可执行程序,不会带有调试信息。Release相比于Debug,运行效率高,运行内存消耗低,占用空间少,整体的性能较优,但是Release版本不能调试。

gcc默认情况采用Release版本发布可执行文件,如果要采用Debug版本发布,那么需要-g选项。

图4.1对比了采用Release版本可Debug版本发布的可执行文件mytest和mytest-debug的占用空间大小,可以看出Debug发布的可执行程序相比于Release占用更多空间。 

Linux开发工具:gcc和g++
图4.1 采用Release和Debug发布可执行程序

通过指令 readelf -S mytest-static | grep -i debug,可以筛选出可执行文件中的调试信息。

Linux开发工具:gcc和g++
图4.2 可执行文件调试信息的提取

五. makefile和make

如果源文件过多,那么手动输入文件名就会十分麻烦,并且如果要删除可执行程序,采用rm批量删除容易误删。通过makefile和make配合使用,可以避免上述问题。

  • makefile:是一个文件。
  • make:是一条指令。

我们需要在源文件的路径下面,通过touch makefile,创建名为makefile的文件。vim makefile打开文件,在首行输入依赖关系,另起一行输入依赖方法(见图5.1),保存并退出makefile文件。我们只需要在命令行中输入指令make,即可生成可执行文件,输入make clean,即可清除可执行文件。

Linux开发工具:gcc和g++
图5.1 makefile文件的内容
Linux开发工具:gcc和g++
图5.2 通过makefile和make实现对源文件的翻译和删除可执行程序

makefile真正的价值,在于同时对多个文件的编译,如果每次gcc/g++操作都输入全部的源文件,容易出错且麻烦,在makefile中设置相应的操作,可以直接使用make指令对多份源文件编译。如图5.3,通过cat指令输出head.h、test.cpp以及main.cpp文件的内容,在设置makefile文件内容如图5.4,此时直接执行make指令,生成可执行文件mytest.exe。

Linux开发工具:gcc和g++
图5.3 文件内容
Linux开发工具:gcc和g++
图5.4 makefile文件内容

如图5.5所示,连续多次执行make指令,只有第一次能生成可执行文件。但是,在使用追加重定向,向main.cpp文件中写入新内容,再次执行make,就又可以编译生成可执行程序了,我们可以认为这是不允许make连续编译,是因为源文件内容没有改变,不会对可执行程序造成影响,更改源文件内容后,编译会生成不同的可执行文件,就允许make执行编译操作。

Linux开发工具:gcc和g++
图5.5 make指令生成可执行文件

问题:make如何判断是否执行编译操作?

答:根据源文件和可执行文件最后一次修改的时间来判断是否编译,如果源文件最后一次修改时间晚于可执行文件,那么make就会对源文件进行编译,否则不会。

这里介绍一条指令:

  • stat 文件名 -- 显示文件状态信息

如果5.6所在,使用stat输出main.cpp文件的状态信息后,可以看到有Access、Modify、Change三个时间状态信息,他们所代表的含义分别为:文章来源地址https://www.toymoban.com/news/detail-470812.html

  1. Access -- 文件最后一次访问时间。
  2. Modify -- 文件最后一次修改内容的时间。
  3. Change -- 文件最后一次修改属性的时间。
Linux开发工具:gcc和g++
图5.6 stat输出文件状态信息

六. 总结 

  • gcc/g++都是Linux下的代码编译器,gcc只能编译C语言代码,g++既能编译C语言代码也能编译C++代码,因为C++兼容C语言。
  • gcc/g++能够实现从源文件到可执行文件的翻译,有-E/-S/-c选项,功能分别为翻译到 预编译/编译/汇编 就终止翻译,如果不显示声明-E/-S/-c的任意一个,那么直接完成链接操作,生成可执行文件。
  • gcc默认生成的可执行文件的文件名为a.out,如果希望自定义可执行文件文件名,需要-o选项实现,-o的功能为:将生成的文件,输出重定向的特定文件。
  • 库可以分为动态库和静态库,通过后缀名来区分动态库和静态库,库本质上是源文件经过翻译后生成的文件,具有自己的路径,同时,库遵循特定的命名规范。在Linux下,各种库文件存储在路径/lib64/下。
  • 链接分为动态链接和静态链接,动态和静态链接要依赖动态库和静态库。动态链接的可执行文件体积小,但是如果动态库丢失就无法正常运行,安全性相对较低。静态链接的可执行文件体积大,但静态库丢失以及能正常运行。
  • gcc默认采用动态链接的方式生成可执行文件,如要采用静态链接,应使用-static选项。
  • gcc默认采用Release版本生成可执行文件,如果要使用Debug版本,应当使用-g选项。
  • 通过makefile和make、make clean的配合使用,可以快捷实现翻译源文件和删除可执行程序。

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

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

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

相关文章

  • 『Linux升级路』基础开发工具——gcc/g++篇

    🔥 博客主页: 小王又困了 📚 系列专栏: Linux 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、快速认识gcc/g++  二、预处理 📒1.1头文件展开  📒1.2条件编译 二、编译 三、汇编 四、链接 📒4.1库的概念 📒4.2库的特点 📒4.3库的分类 📒4.4动态

    2024年02月05日
    浏览(39)
  • 【Linux】环境基础开发工具使用——gcc/g++使用

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

    2024年04月09日
    浏览(53)
  • Linux 开发工具vim、gcc/g++、makefile

    目录 Linux编辑器-vim 1. 基本概念 2. 基本操作 3. 正常模式命令集 4. 末行模式命令集 5. 其他操作 6. 简单vim配置 Linux编译器-gcc/g++ 1、基本概念  2、程序翻译的过程 3. gcc如何完成程序翻译 4、动静态库  Linux项目自动化构建工具-make/Makefile 1、背景 2、创建makefile 3、原理 5、项目清

    2024年03月11日
    浏览(66)
  • 【linux基础(六)】Linux中的开发工具(中)--gcc/g++

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到开通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 如果你不知道vim的各种用法和快捷键 请先阅读上一篇文章: yum和vim详解 现在,我们可以在Linux下编辑代码了 编辑好的文件是

    2024年02月07日
    浏览(35)
  • 【Linux环境基础开发工具】编译器-gcc/g++

    上一篇博客, 我们学习了vim编辑工具,学会了怎么写代码, 这篇文章,我将分享代码该怎么编译的问题。 目录 写在前面: 1. gcc和g++介绍 2. gcc是如何编译程序的 1. 预处理 2. 编译 3. 汇编 4. 链接 3. gcc的选项介绍 4. 我们使用的函数是哪来的 5. 我们的.o文件和库是如何链接的?

    2024年02月10日
    浏览(50)
  • Linux开发工具:yum、vim、gcc/g++、makefile

    在 Linux 下安装软件一共有三种方式: 源代码安装 有很多开源软件的源代码会被作者放在Github/Gitee 等网站上, 可以将这些源代码下载在本地. 通过直接在本地将这些源代码进行编译链接生成可执行程序 . 在嵌入式编程中, 经常用到交叉编译来处理不同平台的适配性. rpm包直接安装

    2024年01月19日
    浏览(46)
  • Linux:基础开发工具之yum,vim,gcc的使用

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

    2024年02月08日
    浏览(52)
  • Linux开发工具-vim-gcc-gdb指令及使用

    目录 linux软件包管理器yum(apt) linux开发工具 linux编辑器-vim使用 linux编译器-gcc/g++使用 linux调试器-gdb使用 linux项目自动化构建工具-make/makefile linux第一个小程序-进度条 使用github创建项目 使用git命令 我们前面学了关于linux的基本指令和基本权限的一些相关知识,那么我们今天

    2024年03月10日
    浏览(59)
  • 【嵌入式】Linux开发工具arm-linux-gcc安装及使用

    宿主机 执行编译、链接嵌入式软件的计算机 目标机 运行嵌入式软件的硬件平台 “本地”编译器 用来生成在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,例如 Windows 环境生成 Windows 目标代码。 交叉编译器 用来生成在其它平台上运行的目标代

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

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

    2024年02月06日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包