Makefile第三课:C语言的编译

目录

  • C语言的编译
    • 前言
    • 1.Fundamental Compiling
    • 2.Comiling C
      • 2.1 Preprocessing
      • 2.2 Generating Assembly Language
      • 2.3 Source File to Object File
      • 2.4 Single Source to Executable
      • 2.5 Multiple Sources to Executable
    • 3.Creating a Static Library
    • 4.Creating a Shared Library
    • 5.总体概括
      • 5.1 编译过程
      • 5.2 编译过程命令
      • 5.3 库
        • 5.3.1 静态库
        • 5.3.2 动态库
    • 总结

C语言的编译

前言

学习杜老师推荐的Makefile教程视频,链接。记录下个人学习笔记,仅供自己参考。

之前有转载过杜老师的从零Makefile落地算法大项目文章,感兴趣的可以看看。

本课程主要讲解通过gcc实现C语言的编译过程以及静态库和动态库文件的生成。

1.Fundamental Compiling

编译C语言相关的后缀如下

在这里插入图片描述

2.Comiling C

2.1 Preprocessing

# 不会生成 .i 文件
gcc -E main.c
gcc -E main.c -o helloworld.i
  • -E 选项告诉编译器只进行预处理操作
  • -o 选项把预处理的结果输出到指定文件

2.2 Generating Assembly Language

gcc -S main.c
gcc -S main.c -o xxx.s
  • -S 选项告诉编译器,进行预处理和编译成汇编语言操作

每个平台对应的汇编语言的形式是不同的,例如有很多型号的开发板,有很多型号的 CPU

2.3 Source File to Object File

gcc -c main.c
gcc -c main.c -o xxx.o
# 编译多个 .c 文件
gcc -c main.c add.c minus.c

2.4 Single Source to Executable

  • 注意:后面三个命令执行后并没有按汇编过程出现 .i .s 或 .o 文件,并不意味着没有经历这些过程
gcc main.c
gcc main.c -o xxx

执行程序

./可执行程序

2.5 Multiple Sources to Executable

gcc main.c add.c minus.c -o exec
./exec

3.Creating a Static Library

  • 编译成 .o 的文件

    gcc -c [.c] -o [自定义文件名] 
    gcc -c [.c] [.c] ...
    
  • 编译静态库

    ar -r [lib自定义库名.a] [.o] [.o] ...
    
  • 链接成可执行文件

    gcc [.c] [.a] -o [自定义输出文件名]
    gcc [.c] -o [自定义输出文件名] -l[库名] -L[库所在路径]
    

4.Creating a Shared Library

  • 编译成 .o 文件

    gcc -c -fpic [.c/.cpp][.c/.cpp]... 
    
  • 编译动态库

    gcc -shared [.o][.o]... -o [lib自定义库名.so]
    
  • 链接成可执行文件

    gcc [.c/.cpp] -o [自定义可执行文件名]  -l[库名] -L[库路径] -Wl,-rpath=[库路径]
    

5.总体概括

5.1 编译过程

源文件.c文件->预编译成.i文件->编译成汇编语言.s->汇编成.o文件->链接成可执行文件(名字自定义,后缀没关系)

5.2 编译过程命令

  • 预处理:

    gcc -E [.c源文件] -o [自定义输出文件名.i]
    
  • 编译成汇编语言(隐藏了预处理操作) :

    gcc -S [.c源文件] 
    
  • 会变成.o的object文件(二进制文件,可用于链接) :

    gcc -c [.c源文件] [.c源文件] [...] (可选选项:-o [自定文件名])
    

5.3 库

5.3.1 静态库

  • 编库(先转成.o文件,再编成lib[自定库名].a)

    gcc -c [.c源文件] [.c源文件] [...] (可选选项:-o [自定文件名])
    
    ar -r lib[自定库名].a [.o文件] [.o文件] [...]
    
  • 链接

    gcc [main文件] -o [自定义输出可执行文件名] -l[库名] -L[库的路径]
    

5.3.2 动态库

  • 编库

    • 第一种做法, 先转成.o文件,再编成.so文件

      gcc -c -fpic [.c源文件] [.c源文件] [...]
      
      gcc -shared [.o文件] [.o文件] [...] -o lib[库名].so
      
    • 第二种做法,直接转成.so

      gcc -fpic -shared [.c源文件] [.c源文件] [...] -o lib[库名].so
      
  • 链接

    gcc [main文件] -o [自定义输出可执行文件名] -l[库名] -L[库所在路径] -Wl,-rpath=[库所在路径]
    

总结

本次课程学习了c语言文件通过gcc完整的编译过程,以及通过gcc将c语言文件编译成库文件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贯穿设计模式第二话--开闭职责原则

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 从今天开始,将…

java基础学习——字符流

1.为什么会出现字符流: 由于字节流 操作中文不是特别的方便,所以java就提供字符流 字符流字节流编码表 用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文&#xf…

摄影入门 | 相机的基本原理

一、获取图像——小孔成像实验 小孔成像实验中,点燃蜡烛,会在小孔另一面的白纸上看到一个倒立的烛焰。 此现象可以用来解释物理学原理:光在同种均匀介质中,在不受引力作用干扰的情况下沿直线传播。 这样,我们就用一种…

从零开始搭建游戏服务器 第一节 创建一个简单的服务器架构

目录引言技术选型正文创建基础架构IDEA创建项目添加Netty监听端口编写客户端进行测试总结引言 由于现在java web太卷了,所以各位同行可以考虑换一个赛道,做游戏还是很开心的。 本篇教程给新人用于学习游戏服务器的基本知识,给新人们一些学习…

伪静态技术

网址和纯静态一样,只是,其内部仍旧需要查询数据库:如果有一个页面,希望这个页面利于seo,但是有不适合使用真静态,比如csdn论坛帖子,可以考虑使用伪静态,即: 形式上是一个静态地址,比…

Chapter7.2:MATLAB在频率法中的应用及频率法稳定性分析

该系列博客主要讲述Matlab软件在自动控制方面的应用,如无自动控制理论基础,请先学习自动控制系列博文,该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接:https://blog.csdn.net/qq_39032096/category_10287468…

PyTorch 深度学习实战 | DIEN 模拟兴趣演化的序列网络

01、实例:DIEN 模拟兴趣演化的序列网络深度兴趣演化网络(Deep Interest Evolution Network,DIEN)是阿里巴巴团队在2018年推出的另一力作,比DIN 多了一个Evolution,即演化的概念。在DIEN 模型结构上比DIN 复杂许多,但大家丝毫不用担心,我们将DIEN 拆解开来详细地说明…

Intel 处理器 macOS降级到Big Sur

1 创建可引导的 macOS 安装器 将移动硬盘作安装 Mac 操作系统的启动磁盘。 创建可引导安装器需要满足的条件 移动硬盘(格式化为 Mac OS 扩展格式),至少有 14GB 可用空间已下载 macOS Big Sur的安装器 2 下载 macOS macOS Big Sur安装器会…

【GPT4】微软 GPT-4 测试报告(1)总体介绍

欢迎关注【youcans的AGI学习笔记】原创作品,火热更新中 微软 GPT-4 测试报告(1)总体介绍 微软 GPT-4 测试报告(2)多模态与跨学科能力 微软 GPT-4 测试报告(3)GPT4 的编程能力 【GPT4】微软 GPT-…

Thingsboard使用gateway网关

简介: 本次是想测试一下thingsboard网关的使用,实现通过网关mqttthingsboardemqx 实现间接设备创建和数据传输 前期准备: thingsboard平台 thingsboard网关 emqx平台 MQTTX工具 详细过程: 1:thingsboard平台搭建 …

字节、阿里等大厂年薪50w+的测试都什么水平?

各位做测试的朋友,但凡经历过几次面试,那么你一定曾被问到过以下问题: 1、在Linux环境下,怎么执行web自动化测试? 2、Shell如何,Docker熟悉吗? 3、全链路的压测实操过吗,如何推进与开…

FasterNet实战:使用FasterNet实现图像分类任务(一)

文章目录摘要安装包安装timm安装 grad-cam数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集摘要 论文翻译:https://wanghao.blog.csdn.net/article/details/129485972?spm1001.2014.3001.5502 官方源码: https://github.com/JierunChen/Faste…

VR实景导航,解决最后几十米的导航问题

你是否跟朋友有过这样的经历:“哎,你说的那个餐厅在哪呀?”,“这家商场好复杂,怎么转啊”,“你在医院哪一层?我怎么找不到你呀!”等等。在建筑内部,我们的地图导航并不是…

在U盘上运行的 Windows

版本:5.6.1平台:Win x64语言:简体中文,繁体中文,英文更新时间:2023-03-04 下载地址:https://dl.luobotou.org/wtga5610.zip 解压后运行WTGA文件夹中的wintogo.exe启动程序。从5.5版本开始不再支持32位系统、Win7系统…

HTTP协议加强

HTTP协议加强 Date: January 19, 2023 Sum: HTTP请求、响应、请求方法、响应状态代码 HTTP协议简介 什么是通信 通信,就是信息的传递和交换。 通信三要素:通信的主体、通信的内容、通信的方式 现实生活中的通信 案例:张三要把自己考上传…

美颜SDK技术原理、技术应用、代码分析

随着社交媒体的普及,人们对于自己的外貌越来越重视。为了满足用户对于美颜需求,各大科技公司纷纷推出了美颜SDK技术,使得用户可以在拍照和视频中实现美颜效果。本文将对美颜SDK技术进行详细分析。 一、美颜SDK技术的原理 美颜SDK技术是一种基…

精简指令集结构(Reduced Instruction Set Computer,RISC)

ARM内核采用精简指令集结构(Reduced Instruction Set Computer,RISC)体系结构。RISC技术产生于20世纪70年代,其设计目标是创建一种能以每个时钟周期执行一条指令的速度很快的计算机。RISC的设计重点在于降低由硬件执行的指令复杂度…

Kubeadm生成的k8s证书内容说明以及延长证书过期时间

Kubeadm生成的k8s证书内容说明Kubeadm生成的k8s证书内容说明:证书分组Kubernetes 集群根证书由此根证书签发的证书有:kube-apiserver 代理根证书(客户端证书)etcd 集群根证书etcd server 持有的服务端证书peer 集群中节点互相通信使用的客户端证书pod 中定义 Livene…

函数的定义与使用及七段数码管绘制

函数的定义 函数是一段代码的表示 函数是一段具有特定功能的、可重用的语句组 函数是一种功能的抽象,一般函数表达特定功能 两个作用:降低编程难度 和 代码复用 求一个阶乘 fact就是 函数名 n就是参数 return就是输出部分即返回值 而函数的调用就是…

【计量】回归背后的微操作——论文自救记录(进行中)

【计量】回归背后的微操作 1. 变量的选择 与 模型的设定 https://zhuanlan.zhihu.com/p/50577508?yidian_smb 2. 变量的处理 2.1 常用的处理——中心化、标准化、归一化 目的:统一量纲(Scale)—— 可以理解成 100分制下,1 2分…