【LittleXi】C程序预处理、编译、汇编、链接步骤

【LittleXi】C程序预处理、编译、汇编、链接步骤

C程序

#include<stdio.h> int main(){int x=1,y=1;printf("x+y=%d",x+y);
}

1、预处理

将头文件引入进来、除去注释、宏定义下放

执行指令

g++ -E esc.c -o esc.i

2、编译

将处理好的代码编译为汇编代码.s

执行指令

g++ -S esc.i -o esc.s

3、汇编

将编译好的.s文件转为机器码.o

执行指令

g++ -c esc.s -o esc

4、链接

  • 链接是将多个目标文件和库文件组合成最终的可执行文件的过程。
  • 链接器(如GNU链接器,通常称为ld)执行这一过程,解决了不同目标文件之间的符号引用关系,将它们连接在一起。
  • 主要任务包括解析符号引用、符号解析、符号重定位、生成可执行文件。
  • 如果使用了外部库(如标准C库),链接器还会将所需的库文件与程序一起链接,以满足程序的依赖性。

执行指令

g++ esc.o -o esc

请添加图片描述

5、补充,也可以自己写Makefile文件,示例如下

文件main.c

// main.c
#include <stdio.h>
#include "library.h"int main() {int result = add(3, 5);printf("Result: %d\n", result);return 0;
}

文件library.h

// library.h
#ifndef LIBRARY_H
#define LIBRARY_Hint add(int a, int b);#endif

文件library.c

// library.c
#include "library.h"int add(int a, int b) {return a + b;
}

Makefile文件

CC = g++
CFLAGS = -Wall -std=c++11
SRC = main.cpp library.cpp
OBJS = $(SRC:.cpp=.o)
TARGET = mainall: $(TARGET)$(TARGET): $(OBJS)$(CC) $(CFLAGS) $^ -o $@%.o: %.cpp$(CC) $(CFLAGS) -c $< -o $@clean:rm -f $(OBJS) $(TARGET).PHONY: all clean

解释

  1. CC = g++
    • 这一行定义了一个Makefile变量 CC,它指定了C++编译器的名称。在这个示例中,我们使用 g++ 作为C++编译器。
  2. CFLAGS = -Wall -std=c++11
    • 这一行定义了一个Makefile变量 CFLAGS,它包含了编译选项。-Wall 表示启用所有警告,-std=c++11 指定了C++11标准。
  3. SRC = main.cpp library.cpp
    • 这一行定义了一个Makefile变量 SRC,包含了项目的所有源文件的名称。
  4. OBJS = $(SRC:.cpp=.o)
    • 这一行定义了一个Makefile变量 OBJS,它是 SRC 中所有源文件的目标文件的列表。.cpp 文件扩展名被替换为 .o 文件扩展名。
  5. TARGET = main
    • 这一行定义了一个Makefile变量 TARGET,表示最终的可执行程序的名称。
  6. all: $(TARGET)
    • 这是一个Makefile规则,表示 all 是默认的目标。当你运行 make 命令时,它将构建 $(TARGET)
  7. $(TARGET): $(OBJS)
    • 这是一个Makefile规则,定义了如何从目标文件构建可执行程序。$(OBJS) 表示依赖于目标文件列表。规则中的命令 $(CC) $(CFLAGS) $^ -o $@ 使用 g++ 编译器编译目标文件,并将其链接为可执行程序。
  8. %.o: %.cpp
    • 这是一个Makefile规则,定义了如何将每个源文件编译成对应的目标文件。%.o 表示所有的目标文件,%.cpp 表示对应的源文件。规则中的命令 $(CC) $(CFLAGS) -c $< -o $@ 编译每个源文件为对应的目标文件。
  9. clean
    • 这是一个Makefile规则,用于清理生成的目标文件和可执行程序。命令 rm -f $(OBJS) $(TARGET) 删除目标文件和可执行程序。
  10. .PHONY: all clean
    • 这一行告诉Make工具,allclean 是伪目标,不代表实际文件,因此不会检查它们的时间戳。这样可以确保 make 始终执行这两个目标,而不受文件时间戳的干扰。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go ZIP压缩文件读写操作

创建zip文件 golang提供了archive/zip包来处理zip压缩文件&#xff0c;下面通过一个简单的示例来展示golang如何创建zip压缩文件&#xff1a; func createZip(filename string) {// 缓存压缩文件内容buf : new(bytes.Buffer)// 创建zipwriter : zip.NewWriter(buf)defer writ…

Android开发中遇到的问题请求帮助分析解决

本篇文章主要寻求广大的网友&#xff0c;对我遇到的问题进行分析解答&#xff0c;希望能给出更好的&#xff0c;更优化的方法。话不多说先上遇到的问题的流程图的分析&#xff1a; 以上就是流程分析图&#xff0c;希望能够尽快解决&#xff0c;希望得到大家的支持。再次本人非常…

2023最新electron 进程间通讯的几种方法

数据传递&#xff08;旧&#xff09; 渲染进程发数据到主进程 // 按钮事件 const handleWebRootPathClick () > {ipcRenderer.send(open_dir) }// main.ts中接收 ipcMain.on(open_dir, () > {console.log(recv ok) }) 主进程发数据到渲染进程 // main.ts中发送数据 …

大数据分析师职业技能提升好考吗?含金量高不高

随着大数据时代的到来&#xff0c;大数据分析技能需求已经成为很多企业和机构的必备要求。大数据分析师证书成为当下的热门之一&#xff0c;那么大数据分析师证书需要具备哪些条件呢&#xff1f; 首先&#xff0c;报考大数据分析师证书需要具备以下方面的条件&#xff1a; …

数据恢复入门分享-启动扇区

启动扇区位于存储区的前端&#xff0c;一般显示如下 如果扇区数据丢失或者错误 存储器也就不能识别和数据存储了 关注我们&#xff0c;不定期分享互联网数字化的干货 #数据恢复##储存卡##启动扇区#

arcgis--创建多分辨率DEM

方法一&#xff1a;技术链为【栅格转点】-【创建TIN】-【TIN转栅格】。首先需要将栅格转成点数据&#xff0c;再根据点数据创建TIN&#xff0c;再将TIN转栅格。 1、打开一幅DEM影像图&#xff0c;如下&#xff1a; 在【转换工具】-【由栅格转出】 -【栅格转点】工具中&#xf…

动作活体检测能力支持自定义扫描动作,开发者接入更高效

随着人脸识别技术在金融、医疗等多个领域的加速落地&#xff0c;网络安全、信息泄露等问题愈为突出&#xff0c;用户对应用稳定性和安全性的要求也更为严格。 华为机器学习服务的动作活体检测能力&#xff0c;支持实时捕捉人脸&#xff0c;根据用户配合做动作可以判断是真实活…

海报设计必备!五个免费网站分享,让你的创意得以充分展现!

海报作为一种重要的宣传工具&#xff0c;在各种场合得到了广泛的应用。然而&#xff0c;对许多人来说&#xff0c;制作一张漂亮的海报并不容易。幸运的是&#xff0c;有许多免费的海报制作网站可以帮助人们轻松地制作出漂亮的海报。本文将分享五个优秀的免费海报制作网站。 1.…

RK3568笔记五:基于Yolov5的训练及部署

若该文为原创文章&#xff0c;转载请注明原文出处。 一. 部署概述 环境&#xff1a;Ubuntu20.04、python3.8 芯片&#xff1a;RK3568 芯片系统&#xff1a;buildroot 开发板&#xff1a;ATK-DLRK3568 开发主要参考文档&#xff1a;《Rockchip_Quick_Start_RKNN_Toolkit2_C…

双十一买高画质投影仪,当贝F6还是极米H6?

如果你想购买一台4K画质的投影仪,那么在各大平台搜索“双十一最值得买的4K投影仪”时,一定会注意到当贝F6和极米H6这两个型号投影仪。个人认为当贝F6和极米H6都分别是当贝和极米两个品牌非常具有性价比的4K投影仪。那么到底哪一台更适合你。 首先放一张参数对比图,方便参数控研…

Leetcode—191.位1的个数【简单】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—191.位1的个数 实现代码 int hammingWeight(uint32_t n) {int ans 0;for(int i 0; i < 32; i) {if(n & ((long long)1 << i)) {ans;}}return ans; }运行结果 翻转比特1思路 就解法一的代码实现来说&am…

node服务部署vue3(ssr)单页面应用上线

博主最新开发了vue3新版的单页面服务端渲染的博客&#xff0c;框架用的vue3框架&#xff0c;vite4构建&#xff0c;在部署上线的时候遇到了一些问题&#xff0c;现在分享给大家。避免踩坑 node环境搭建 node安装包下载 因为我的服务器系统是linux&#xff0c;所以选择linux版本…