小解C语言文件编译过程【linux】

news2025/1/24 22:36:28

小解C语言文件编译过程【linux】

    • 动态库
    • 静态库
  • C语言文件 程序编译过程
    • 整体
      • 预处理
      • 编译
      • 汇编
      • 链接
        • 动态链接
        • 静态链接
        • 两种方法对比

看到标题是文件编译过程
但是开头却是库,这可不是挂羊头卖狗肉,而是因为库也是代码不可缺少的一部分并且在编译过程中需要进行处理

那我们首先需要知道什么是库?

还记得我们写C语言时候,如果用到printf等函数,需要包上stdio的头文件吗
包上头文件后我们就能正常使用函数了
但是实际上,头文件中,只有函数的声明,而没有函数的实现和定义

那实现代码在哪呢?
就是在库中。

但是我们在写代码的过程中,并没有导入库
而导入库就是编译的过程中的部分了。

现在先来讲库的种类。

动态库

linux
动态库 .so
win
动态库:.dll

静态库

linux:
静态库 .a
windows
静态库:.lib

库的类型区分,主要体现在导入的方法中。

所以接下来进入编译过程的解读。

C语言文件 程序编译过程

大家都知道,对于计算机来说,只认识二进制码
那我们用了这么久的C语言,大家可能对C语言是如何转化成机器语言优点不太熟悉
所以这里就用linux系统,来带大家来认识一下C程序的编译过程

这里为了讲解就随便用了一个写了一个.C文件

#include<stdio.h>
#define max 10
int main()
{
  printf("%d\n",max);
  return 0;
}

整体

大致流程如图
在这里插入图片描述
接下来我们分别来看一下每个步骤:

预处理

预处理主要是将程序中的头文件展开以及宏定义和特殊符号进行处理

在linux中我们可以用

gcc -E test.c -o test.i

进行执行

这里的-E代表的意思是执行预处理指令
预处理结束后,会生成.i的文件
但是这里为了方便就直接重命名成test.i了
在这里插入图片描述
这里多了test.i文件
在这里插入图片描述
在test.i文件内部,我们能发现已经将stdio的头文件进行了展开
在这里插入图片描述
我们的写的代码还未进行处理

编译

编译:检查C语言程序语法,并将其转化为汇编语言。
可以用:

gcc -S test.i -o test.s

这个指令是要求test.c文件执行编译步骤

结束后会生成.s文件

在这里插入图片描述
我们通过cat指令
能看到test.c内部是汇编语言

汇编

汇编:将汇编语言转化为二进制码

通过一下代码执行至汇编部分

gcc -c test.s -o test.o

但是将代码转化为计算机认识的二进制码以后,也还没结束
还有最后一步。

链接

链接:将二进制码与程序所需的库相链接

库已经在上面进行了解释

gcc test.o -o test

这里就是最后一步了,成功生成了test的可执行程序

但是其实,链接还有两种情况,记得我们上面讲的静态库和动态库

链接的作用是将库和文件链接
那既然有两种库,那就有两种链接方式。

动态链接

动态链接就是链接动态库
动态库链接方式其实就是我们上面的

gcc test.o -o test

就是说默认的链接方式就是动态链接

那动态链接是如何使用库的呢?
通俗的讲就是:需要用到库的时候自己去库里面找

留下了函数对应的接口,之后需要使用库的内容的时候,直接去原库中去寻找。

静态链接

静态链接是与静态库相对应的
当我们使用静态库的时候就进行静态链接。
我们可以用

gcc test.o -static -o test

这个方式来设置为静态链接
我们可以看看静态链接和动态链接文件大小

在这里插入图片描述

我们看到动态和静态大小差异巨大
这是因为:静态链接方式是将整个静态库写入至代码中

可以说这多出来的800000位的大小都是库的大小

两种方法对比

了解两种的链接方式后,会发现他们其实优缺点还是挺明显的

静态链接
优点:方便移植,不需要搭建库(毕竟整个库都在文件中)
缺点:浪费资源(读写资源,磁盘空间等)
静态链接
优点:节省资源
缺点:使用时需要下载动态库

但是实际上使用的时候,可以在一个项目中按照需求进行选择
做到静态和动态链接搭配使用

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

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

相关文章

运维 | 如何查看端口或程序占用情况 | linux

运维 | 如何查看端口或程序占用情况 | linux 前言 本期主要介绍了 LINUX 中如何查看某个端口或程序的使用情况&#xff0c;希望对大家有所帮助。 快速使用 netstat 命令&#xff08;推荐&#xff09; netstat 命令可以显示网络连接、路由表和网络接口信息等。可以使用 net…

股票量化分析工具QTYX使用攻略——代号“飞龙在天”,狙击龙头股战法(更新2.7.1)...

搭建自己的量化系统 股票量化交易系统QTYX是一个即可以用于学习&#xff0c;也可以用于实战炒股分析的系统。 分享QTYX系统目的是提供给大家一个搭建量化系统的模版&#xff0c;最终帮助大家搭建属于自己的系统。因此我们提供源码&#xff0c;可以根据自己的风格二次开发。 关于…

芯片学习记录LM2596

LM2596 芯片介绍 LM2596 系列稳压器是为降压开关稳压器提供所有有效 功能的单片集成电路&#xff0c; 能够驱动 3A 的负载 &#xff0c; 并且拥有 出色的线路和负载调节性能。这些器件可提供 3.3V 、 5V、 12V 固定输出电压和可调节输出电压版本。 这类稳压器不仅需要很少的…

企业如何通过媒体宣传扩大自身影响力

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 企业可以通过媒体宣传来扩大自身的影响力。可以通过以下的方法。 1. 制定媒体宣传战略&#xff1a; - 首先&#xff0c;制定一份清晰的媒体宣传战略&#xff0c;明确您的宣传目标、目标…

Ubuntu:Arduino IDE 开发环境配置【保姆级】

物联网开发学习笔记——目录索引 本章主要介绍在Ubuntu系统搭建Arduino IDE 开发环境&#xff0c;windows系统请移步&#xff1a;Windows&#xff1a;Arduino IDE 开发环境配置【保姆级】 参考官网&#xff1a;Arduino - Home 有关更多详细信息&#xff0c;请参阅 Arduino …

SpringCloud-Stream

一、介绍 &#xff08;1&#xff09;提供统一接口操作不同厂商的消息队列组件&#xff0c;降低学习成本 &#xff08;2&#xff09;生产者和消费者只需操作binder对象即可与消息队列交互&#xff0c;生产者output&#xff0c;消费者input &#xff08;3&#xff09;核心概念&a…

RobotFramework用户关键字(一)

文章目录 一 用户关键字1. 创建用户关键字2. 用户关键字的使用3. 用户关键字参数4. 用户关键字返回参数 一 用户关键字 Robotframework是一个用python写的基于关键字驱动的自动化测试框架。既然是基于关键字驱动的&#xff0c;那么关键字的编写和使用就是平时工作的核心。这篇文…

单链表经典OJ题

目录 ​编辑 题目&#xff1a; 一、移除链表元素&#xff1a; 本质&#xff1a; 解题思路&#xff1a; 本题分为两种解法&#xff1a; 我们使用解法二&#xff1a; 注意事项&#xff1a; 完整代码&#xff1a; 题目&#xff1a; 一、移除链表元素&#xff1a; 本质&…

论文阅读:Segment Any Point Cloud Sequences by Distilling Vision Foundation Models

论文地址&#xff1a;[2306.09347] Segment Any Point Cloud Sequences by Distilling Vision Foundation Models (arxiv.org) 代码地址&#xff1a;GitHub - youquanl/Segment-Any-Point-Cloud: [NeurIPS23 Spotlight] Segment Any Point Cloud Sequences by Distilling Visi…

计网第六章(应用层)(二)(域名系统DNS)

一、基本概述 域名和IP地址&#xff1a;在1983年&#xff0c;因特网就开始采用层次结构的命名树作为主机的名字&#xff0c;即域名。因为域名比IP地址更加方便人们记忆&#xff0c;人们可以通过域名更加方便地访问互联网。但实际上网络识别的仍然是IP地址&#xff0c;所以就有…

文件操作(打开关闭文件、文件顺序以及随机读写)

文章目录 写在前面1. 文件的打开与关闭1.1 文件指针1.2 文件的打开(fopen)与关闭(fclose)1.2.1 fopen函数1.2.2 fclose函数 2. 文件的顺序读写2.1. fgetc 和 fputc函数2.1.1 fputc函数2.1.2 fgetc函数 2.2 fgets 和 fputs函数2.2.1 fputs函数2.2.2 fgets函数 2.3 fscanf和fprin…

密码学技术总结

前言 本文内容主要摘抄网络规划设计师的教材和腾讯-SUMMER课堂&#xff0c;主要对网络安全进行简单梳理和总结 对称密码体制 密码分为私钥和公钥密码两种&#xff0c;而介于私钥和公钥只见密码成为混合密码。 私钥密码又称为对称密码&#xff0c;该体制的特点是加密和解密…

软件开发项目文档系列之二如何撰写项目建设方案

目录 前言1 项目概况2 需求分析3 建设目标4 建设内容4.1 建设原则4.2 设计依据4.3 总体框架4.4 建设任务4.5 技术方案 5 实施保障措施6 验收和考核指标7 投资预算7.1 资金来源7.2 预算表7.3 预算编制说明 结语 前言 建设方案或解决方案是在任何新项目或计划启动之前&#xff0…

程序员如何运营好博客平台

shigen坚持日更的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考&#xff0c;不断沉淀和成长。 不知不觉间&#xff0c;我发现从我的日更博客和公众号目标确定到现在&#xff0c;我已经坚…

数据库实验一:学生信息管理系统数据库结构搭建和表的创建

实验项目名称&#xff1a;学生信息管理系统数据库结构搭建和表的创建 实验目的与要求实验原理与内容1. 数据库的组织结构2. 数据库的分离和附加3. 数据库表的创建&#xff0c;修改和删除 实验过程与结果1. 根据学生信息管理系统创建相关的数据库2. 数据库表初步设计及实现3. 实…

【算法训练-排序算法 二】【手撕排序】快速排序、堆排序、归并排序

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【手撕排序系列】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

ffmpeg+安卓+yolo+RK3399部署

一次满足多项需求. 首先, 思路是, 使用ffmpeg解码本地mp4文件, 在无需任何其他改动的情况下, 就可以直接播放rtsp流, 这个是使用ffmpeg的好处. ffmpeg本身是c语言的, 所以需要编译成jni的库, https://note.youdao.com/s/6XeYftc 具体过程在这里, 用windows/macOS, Ubuntu应该都…

Python 字典

目录 1 字典介绍2 字典的创建3 字典元素的访问4 字典元素添加、修改、删除5 序列解包6 表格数据使用字典和列表存储&#xff0c;并实现访问7 字典核心底层原理(重要)7.1 将一个键值对放进字典的底层过程7.2 扩容7.3 根据键查找“键值对”的底层过程7.4 用法总结&#xff1a; 声…

【多媒体技术与实践】使用OpenCV处理图像(实验三.上)

1&#xff1a;图像直方图 将原彩色图像转成灰度图像&#xff0c;得到该灰度图像的灰度直方图&#xff0c;并对灰度直方图进行直方图均衡化&#xff0c;将原图、灰度图、直方图及均衡化后的直方图一起拼接为一张图片 import cv2 import numpy as np import matplotlib.pyp…

数据结构与算法 | 第一章:概论

本文参考网课为 数据结构与算法 1 第一章概论&#xff0c;主讲人 张铭 、王腾蛟 、赵海燕 、宋国杰 、邹磊 、黄群。 本文使用IDE为 Clion&#xff0c;开发环境 C14。 更新&#xff1a;2023 / 10 / 15 数据结构与算法 | 第一章&#xff1a;概论 数据结构概念逻辑存储运算抽象…