Linux | gcc/g++的使用

news2024/11/15 23:39:46

目录

前言

一、程序的翻译过程

1、预编译

2、编译

3、汇编

4、链接

(1)链接做了什么

(2)动态链接

(3)静态链接

(4)如何使用gcc进行动态链接和静态链接


前言

        本章主要带着大家一起学习Linux下编译C/C++的工具,以及关于动静态库的一些基础知识;

一、程序的翻译过程

        我们的C语言和C++编写出的程序属于翻译型程序,此处以C语言为例,分析程序翻译过程;

1、预编译

        当我们写完一个C语言程序时,首先,我们需要进行预编译操作;预编译主要将头文件展开宏替换条件编译去注释;我们可使用下列指令生成我们的预编译完的文件(以.i为结尾的文件后缀);

gcc -o 生成文件名.i  -E 被预编译的文件名.c

        上图为我们编写的源程序,我们来验证我们的预编译阶段是否完成了上述工作;我们执行以下执行,生成预编译完成后的文件 test.i ;

        预编译生成的文件从大小上,明显可以看出比我们的源文件要大很多,我们再使用vim查看我们的test.i文件,如下图;

        我们发现我们的文件一下就变成了八百多行,前面增加的便是我们的stdio文件展开后的样子,故我们test.i文件变大了很多,因为把我们的库文件代码复制到预编译后的文件中了,而且我们不难发现我们之前些的注释被去掉了,我们的宏也完成了替换,也进行了条件编译的处理,与我们的预想完全一致;

2、编译

        这一步主要实现的将我们的C语言代码编译成汇编代码,我们生成的汇编代码文件以s为后缀名,具体指令如下;

gcc -o 编译生成后文件名.s  -S  .c文件或.i文件都可

        学过汇编语言的友友们,应该就很熟悉了,这就是我们的汇编代码,编译阶段也如我们所料完成了自己的工作;

3、汇编

        这一步主要是将我们的汇编代码转换成机器指令,生成的文件叫 可重定向二进制目标文件(目标文件),这个文件在Linux下一般以o为后缀名,在window下一般以obj为后缀名,具体指令如下;

gcc -o 生成文件名 -c .c文件或.i文件或.s文件都可 

        我们可以使用od指令来阅读我们的可重定向目标文件,如下所示;

        这里生成的已经是机器指令了,但是仍然不能直接执行,必须链接后才可以执行;

4、链接

(1)链接做了什么

        实际上,我们上面的头文件,如 stdio.h 只有函数的声明,并没有函数的定义,因此我们在是使用我们库函数printf、scanf函数时,光有函数声明时远远不够的,我们必须还有具体的函数定义,这些函数定义都放在动态库或静态库,因此我们链接也有动态链接和静态链接;我们首先完成链接,具体指令如下;

gcc -o 生成可执行程序名  .c文件/.i文件/.s文件/.o文件都可

        我们可以通过ldd指令或file指令查看文件使用的动态库/静态库的名字,以及采用何种链接方式;

补充:在Linux下,动态库文件的后缀为.so,静态库文件的后缀为.a,而在window下,动态库文件的后缀为.dll,静态库文件的后缀为.lib;

(2)动态链接

        在动态链接中,我们的程序一旦发现有需要使用库函数的代码,则会保存该库函数在动态库中的地址,运行到此部分时,我们直接通过地址跳转到动态库的代码中,执行函数,执行完函数后继续返回程序执行程序后续代码;因此,一旦我们的动态库出现了问题,我们的程序就无法正确执行;

总结:

动态链接优点:可执行程序较小,因为只保存了库函数地址;

动态链接缺点:十分依赖动态库文件,若文件出现问题,程序则可能出现问题;

(3)静态链接

        在静态链接中,我们的程序会将需要使用的库函数的定义直接拷贝一份到我们的可执行程序中,我们在运行可执行程序时,无需静态库,我们直接调自己拷贝的代码即可;

总结:

静态链接优点:对静态库文件的无依赖,一旦生成可执行程序,即使静态库被删除,也可以运行;

静态链接缺点:静态链接生成的可执行程序由于会拷贝静态库中的函数定义,因此会变得非常大;

(4)如何使用gcc进行动态链接和静态链接

        在gcc中,我们默认使用动态链接的方式进行链接,因此直接使用正常的方式生成可执行程序即可,例如;

gcc -o test-d test.c

        而我们若想使用静态链接的方式进行连接,我们加上一个static选项即可,如下所示;

gcc -o test-s test.c -static

补充:有些小伙伴可能没有安装静态库,可通过下面指令安装静态库

sudo yum install -y glibc-static (Centos)

        显然,我们使用静态链接生成的可执行程序明显比动态生成的可执行程序要大十倍左右,也符合我们之前的推理,我们在通过ldd和file指令查看我们生成的可执行程序所依赖的库;

        test-s是静态链接生成的可执行程序,因此没有依赖的动态库,而test-d是动态链接生成的可执行程序,因此有依赖的动态库,我们可以通过file看出这两个可执行程序是动态链接还是静态链接;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106949.html

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

相关文章

【实战】学习 Electron:构建跨平台桌面应用

文章目录 一、Electron 简介二、Electron 的优势1. 学习曲线平缓2. 丰富的生态系统3. 跨平台支持4. 开源和社区支持 三、Electron 的使用1. 安装 Node.js2. 安装 Electron3. 创建项目4. 初始化项目5. 安装依赖6. 创建主进程文件7. 创建渲染进程文件8. 打包应用程序9. 运行应用程…

【AI视野·今日NLP 自然语言处理论文速览 第五十六期】Tue, 17 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 17 Oct 2023 (showing first 100 of 135 entries) Totally 100 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Step-by-Step Remediation of Students Mathematical Mistakes Authors…

泛微e-office json_common.php SQL注入漏洞

一、漏洞描述 泛微e-office为企业办公提供丰富应用,覆盖常见协作场景,开箱即用。满足人事、行政、财务、销售、运营、市场等不同部门协作需求,帮助组织高效管事理人。 系统 json_common.php 文件存在SQL注入漏洞 二、网络空间搜索引擎搜索 …

【前端学习】—Vuex(十八)

【前端学习】—Vuex(十八) 一、Vuex Vuex是一个专门为Vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

虚拟机zeppelin安装

一、解压 tar -zxvf ./zeppelin-0.10.0-bin-all.tgz -C /opt/soft/ 二、改名字 mv ./zeppelin-0.10.0-bin-all.tgz zeppelin010 三、配置/etc/profile #ZEPPELIN export ZEPPELIN_HOME/opt/soft/zeppelin010 export PATH$ZEPPELIN_HOME/bin:$PATH source /etc/profile 四…

Vue笔记_插件组件_lucky-canvas抽奖转盘

文章目录 官网使用(vue2.x)[1] 下载[2] 引入[3] 使用配置项-width/height配置项-blocks配置项-prizes配置项-buttons优化案例 lucky-canvas 是一个基于 Js Canvas 的抽奖 web 前端组件,提供 大转盘和 九宫格两种抽奖界面,UI 精美,功能强大…

Linux创建与删除用户

Linux创建与删除用户 新增用户: adduser 用户名【添加用户】 passwd 用户名【设置用户密码】删除用户: userdel -r 用户名【删除用户】

C++QT---QT-day2

/*使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中, 在槽函数中判断ui界面上输入的账号是否为"admin",密码是否…

THE PLANETS:EARTH vulnhub

信息收集 netdiscover -i eth0 -r 192.168.239.0,扫描存活主机,发现目标主机 对目标主机进行端口扫描:nmap -p- -sV -O -Pn -A 192.168.239.186,发现443端口存在DNS,域名 在本地得/etc/hosts中添加域名信息 浏览…

地垫/毛绒地毯/地毯GCC认证测试项目介绍

出口美国地垫GCC清关认证 美国联邦法律规定,地毯和垫子要符合易燃性标准和其它要求, 包括2008年《美国消费品安全改进法》的要求。 在地毯和垫子经过检测或合理检测项目后,作为一般用途的 地毯和垫子的生产商和进口商必须在一般合规证书&…

在 Python 中如何向列表或数组添加元素

在这篇文章中,你将了解 Python 中的 .append() 方法。你还会看到 .append() 与其他用于向列表添加元素的方法有什么不同。 让我们开始吧! Python 中的列表是什么?给初学者的定义 编程中的数组是一个有序的项目集合,所有的项目都…

开关电源EMC整改案例-辐射骚扰

1. 测试结果 产品 Coconut1首次 EMC 测试时,辐射、静电、浪涌均失败。本篇先讨论辐射超标. 1.1 辐射超标 50MHz 、100MHz 、130MHz 、200MHz ,4 个频点明显超标,其中 130MHz 左右最明显, 超出 19dB;后将电路板仅…

龙芯S-2K2000板卡测试记录,安装loongnix系统已知问题及DPDK

S-2K2000板卡已知问题 安装系统时PMON需要使用acpi传参pmon下USB键盘不支持热插拔pmon下插入部分USB键盘 进pmon特别慢,兼容性问题,后续统一解决不支持emmc,等待更新pmon S-2K2000板卡手动引导USB命令 load (usb0,0)/boot/vmlinuz. initr…

Julia 笔记:初识julia

1 变量 Julia 不需要指定变量类型,它可以自动推断等号右侧的对象类型 x 10 # 将 10 赋值给变量 xstr "hello" # 将字符串赋值给变量 site_nameflt 9.5 # 浮点型数据 2 注释 单行注释以 # 开头多行注释用 # 与 # 将注释括起来 3 数组 可以存储一个…

windows terminal鼠标右键打开

如果在官网上下载的是zip文件的 需要在注册表修改鼠标右键才能出来 注册表修改如下: 1.先windowsR,在命令框中输入regedit 打开注册表 2.在路径’计算机\HKEY_CLASSES_ROOT\directory\background\shell’下新建一个wt,wt下新建commond 这里…

优化Bloom的降采样

但是我发现不如提高Skip Iterions的数值,降采样的分辨率降低会产生锯齿

Scrum敏捷项目管理中,开发人员(Developers)的职责

​在Scrum敏捷开发中,开发人员(Developers)是Scrum团队中最重要的角色之一,负责产品的开发和交付,其重要性不言而喻。 那开发人员的职责和需要参加的活动是什么呢? Developers核心职责: 承诺…

MIT6.S081Lab1: Xv6 and Unix utilities

MIT6.S081 Lab1: Xv6 and Unix utilities 官方文档 一.Boot xv6 如何成功的boot xv6可以看之前的文章MIT6.S081实验环境搭建,只是多一个步骤,在clone的文件夹中执行 git checkout util切换为util分支即可。 二.sleep 在user/sleep.c中编…

【API篇】五、Flink分流合流API

文章目录 1、filter算子实现分流2、分流:使用侧输出流3、合流:union4、合流:connect5、connect案例 分流,很形象的一个词,就像一条大河,遇到岸边有分叉的,而形成了主流和测流。对于数据流也一样…

基于白冠鸡优化的BP神经网络(分类应用) - 附代码

基于白冠鸡优化的BP神经网络(分类应用) - 附代码 文章目录 基于白冠鸡优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.白冠鸡优化BP神经网络3.1 BP神经网络参数设置3.2 白冠鸡算法应用 4.测试结果&#x…