Linux操作系统下对c语言程序的编译和执行过程gcc,编译链接过程

news2024/11/17 10:42:30

目录

1.gcc,g++,gdb安装

2.gcc分布编译链接

3.编译链接过程

4.执行

4.1 如何执行

4.2 两步执行与一步执行

4.3 多文件的编译执行


1.gcc,g++,gdb安装

命令行写gcc,g++,gdb根据提示安装:sudo apt install gcc/g++/gdb

2.gcc分布编译链接

(1)预编译:
gcc -E main.c -o main.i
(2)编译:
gcc -S main.i -o main.s
(3)汇编:
gcc -c main.s -o main.o
(4)链接
gcc main.o -o main
执行: ./main
或者:全路径/main

3.编译链接过程

编译链接原理:
main.c通过预编译生成main.i文件
main.i通过编译生成main.s文件
main.s通过汇编生成main.o文件(可重定位的二进制目标文件)
链接阶段就是将所有的.o文件, .a文件(静态库文件), .lib文件, .obj文件链接起来,生成.out文件(ELF格式的可执行文件) (Windows是生成.exe文件)
预编译生成.i文件(第一步),编译生成.s文件(第二步),即编译生成汇编指令,然后接下来
**当然就是汇编了,对汇编指令进行汇编,生成.o文件(第(3)步),即变成二进制指令(第(3)
步),最后就是链接了(第四步)**

参考书目及拓展:程序员的自我修养     2.1章  37页

(1)预编译阶段
a)删除所有的"#define",并且展开所有的宏定义;
b)处理所有的条件预编译指令,"#if","#ifdef","#endif"等;
c)处理"#include"预编译指令,将被包含的文件插入到该预编译指令的位置;
d)删除所有的注释;

e)添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错
误和警告时显示行号;
f)保留所有的#pragma编译器指令,因为编译器需要使用它们;

(2)编译阶段
词法分析,语法分析,语义分析,代码优化,汇总符号

(3)汇编阶段:
将汇编指令翻译成二进制格式,生成各个section,生成符号表.
(4)链接阶段
1)合并各个section,调整section的起始位移和段大小,合并符号表,进行符号解析,给符号分配虚拟地址;
2)符号重定位,即在使用符号的地方全部替换成符号的虚拟地址;

4.执行

4.1 如何执行

路径+可执行文件名
或者
路径+可执行文件名 & (将进程放到后台执行);

可以把可执行文件放到 /usr/bin 就可以省略路径了;

思考:为什么?

ps :/usr/bin ps,ls,pwd 

4.2 两步执行与一步执行

1.两步执行

可以三步合为一步,即不经过预编译,编译,汇编三步,直接一步生成.o文件:

  • gcc -c main.c -o main.o 或者 gcc -c main.c
  • gcc -o main main.o 或者gcc -o main main.c

gcc -c main.c(只编译,看有没有语法错误);工作中常用

2.一步执行

可以四步合为一步:
gcc -o main main.c

/.main:查看程序运行结果

4.3 多文件的编译执行

先写如下三个文件:
add.c max.c main.c

//add.h
int add(int x,int y);

//add.c
int add(int x,int y)
{
    return x+y;
} 

//max.h
int max(int x,int y);

//max.c
int max(int x,int y)
{
     return x>y?x:y;
} 


//main.c
#include <stdio.h>
#include "./max.h"
#include "./add.h"
int main()
{
    int a=10;
    int b=20;
    printf("a+b=%d\n",add(10,20));
    printf("a,b的最大值为%d\n",max(10,20));
    return 0;
}

如何执行呢?

错误做法:gcc  -o main main.c (error)

正确做法:

两步执行:

gcc  -c  main.c

gcc  -o main main.c  add.c  max.c

一步执行:

gcc  -o main main.c  add.c  max.c

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

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

相关文章

视频剪辑技巧:探索画中画视频剪辑,如何制作引人入胜的视觉效果

在视频制作领域&#xff0c;画中画视频剪辑是一种备受瞩目的技术&#xff0c;它可以将多个视频画面叠加在一起&#xff0c;形成一种独特的视觉效果。这种剪辑技巧可以让观众同时看到两个或多个视频片段&#xff0c;创造出一种引人入胜的视觉体验。在开始画中画视频剪辑之前&…

C++算法:矩阵中的最长递增路径

涉及知识点 拓扑排序 题目 给定一个 m x n 整数矩阵 matrix &#xff0c;找出其中 最长递增路径 的长度。 对于每个单元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外&#xff08;即不允…

工商业微电网储能盈利方式研究笔记

1. 光储微电网 1.1. 关于光储微电网 光储微电网可以看成是一组由分布式光伏、储能装置、本地负荷组成的包括发、输、配、用管理系统在内的小型局域电网&#xff0c;并通过唯一的公共连接点接入大电网&#xff0c;既可以并网运行也可以独立运行。 发展分布式光储微电网的意义…

STM32 X-CUBE-AI:Pytorch模型部署全流程

文章目录 概要版本&#xff1a;参考资料STM32CUBEAI安装CUBEAI模型支持LSTM模型转换注意事项模型转换模型应用1 错误类型及代码2 模型创建和初始化3 获取输入输出数据变量4 获取模型前馈输出模型应用小结 小结 概要 STM32 CUBE MX扩展包&#xff1a;X-CUBE-AI部署流程&#xf…

ROS 多级tf坐标转换

题目 现有一移动机器人&#xff0c;该机器人的基坐标系为“base_link”&#xff0c;机器人包含3个子坐标系分别为“joint1”&#xff0c;“joint2”&#xff0c;“joint3”。 要求&#xff1a;利用多坐标转换&#xff0c;实现joint1下的坐标向joint2下的坐标转换&#xff0c;…

AMD64内存属性详解

本文参考文档为AMD64 Architecture Programmer’s Manual Volume 2: System Programming&#xff0c;版本号3.41&#xff0c;这不是对原英文文档的翻译&#xff0c;但是所有内容的排版都是根据原手册的排版来的&#xff0c;如有与官方文档冲突的内容&#xff0c;以官方文档为准…

[LeetCode]-622. 设计循环队列

目录 662. 设计循环队列 题目 思路 代码 662. 设计循环队列 622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/design-circular-queue/ 题目 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&…

推荐几个宝藏app

立冬后&#xff0c;真尼玛冷&#xff0c;哎&#xff01;记得多穿点衣服呀&#xff0c;老铁们&#xff01;&#xff01; GKD 去广告神器 下载网址&#xff1a;https://github.com/gkd-kit/gkd 特性&#xff1a; 它不仅支持跳过开屏广告&#xff0c;还支持跳过弹窗广告等&#xf…

Shopee活动取消规则是什么?shopee官方促销活动怎么取消?

作为一家知名的电商平台&#xff0c;shopee官方对于消费者取消促销活动的请求给予了相应的规定和处理流程。 shopee活动取消规则是什么&#xff1f; 首先&#xff0c;消费者应该明确了解虾皮的促销活动取消规则。根据虾皮的官方规定&#xff0c;消费者在参与促销活动之前&…

公司注册股东选择几个人合适?

创业初期很多创业者都会选择有注册有限责任公司&#xff0c;有限责任由五十个以下的股东出资设立&#xff0c;每个股东以其所认缴的出资额为限对公司承担有限责任。那么问题来了股东人数选择几个最合适呢&#xff0c;下面上海注册公司网&#xff08;www.91kaiye.cn&#xff09;…

部署ruoyi-vue-plus和ruoyi-app

nginx.conf worker_processes 1;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 限制…

人工智能基础——Python:运行效率与时间复杂度

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

15 # 手写 throttle 节流方法

什么是节流 节流是限制事件触发的频率&#xff0c;当持续触发事件时&#xff0c;在一定时间内只执行一次事件&#xff0c;这个效果跟英雄联盟里的闪现技能释放差不多。 函数防抖关注一定时间连续触发的事件只在最后执行一次&#xff0c;而函数节流侧重于一段时间内只执行一次…

快速排序实现方法(剑指offer思路)

快速排序思想 从参与排序的数组中&#xff0c;选择一个数&#xff0c;把小于这个数的放在左边&#xff0c;大于这个数的放在右边&#xff0c;然后递归操作。 实现算法思路 选择最后一个当作参考值&#xff0c;使用small索引当作比这个数小的下标值遍历数组&#xff0c;如果小…

MySQL查询时间处理相关函数与方法实践笔记

1. 实践案例 在查询mysql数据库获取数据时&#xff0c;有这样一个需求&#xff1a;按每30分钟分组获取电量数据&#xff0c;形成1天48个数据点。 方法一&#xff1a; select hour(a.CreateTime) 时点,case when MINUTE(a.CreateTime)<30 then 1 else 2 end 半小时,sum(a…

思维模型 斯金纳箱原理

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。通过合理奖惩&#xff0c;塑造行为&#xff0c;此名为“学习”。 1 斯金纳箱原理的应用 1.1 斯金纳箱在游戏设计中的应用-《糖果传奇》 《糖果传奇》是一款由 King 开发的三消游戏&#x…

基于SSM的培训机构运营系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

find和grep命令的简单使用

find和grep命令的简单使用 一、find例子--不同条件查找 二、grep正则表达式的简单说明例子--简单文本查找例子--结合管道进行查找 一、find find 命令在指定的目录下查找对应的文件。 find [path] [expression]● path 是要查找的目录路径&#xff0c;可以是一个目录或文件名…

链表OJ题(2)

目录 1.移除链表元素❓√ 2.反转链表 3.相交链表 4.链表的中间节点 5.链表中倒数第k个节点❓ 6.合并链表❓√ 7.分割链表❓ 今天链表面试OJ题目 移除链表元素反转链表相交链表链表的中间节点链表中倒数第k个节点合并链表分割链表 &#x1f642;起始条件 中间节点 结束条…

YOLOv8-Seg改进:分割注意力系列篇 | 高效多尺度注意力 EMA | ICASSP2023

🚀🚀🚀本文改进:EMA跨空间学习高效多尺度注意力引入到YOLOv8中进行二次创新,改进方法1)head层输出层结合;2)加入backbone; 🚀🚀🚀EMAAttention 亲测在多个数据集能够实现涨点,同样适用于小目标分割 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/…