【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_H

int 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 = main

all: $(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 始终执行这两个目标,而不受文件时间戳的干扰。

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

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

相关文章

测试行业爬了7年,从功能测试到高级测试,工资也翻了好几倍

我在测试行业爬了7年。从功能测试到现在成为高级测试&#xff0c;我的工资也翻了好几倍。 入门阶段&#xff08;功能测试&#xff09; 个人认为&#xff0c;测试的前景还不错&#xff0c;只要你肯努力&#xff1b;刚出来的时候在鹅厂做外包功能测试。每天都很悠闲。点了两年&a…

Cesium深入浅出之自定义材质

引子 做为一名技术宅却没有能拿得出手的技术无疑是最可悲的事情。三年前&#xff0c;当我第一次接触Cesium的时候就被它强大和炫丽所折服&#xff0c;最关键的是它还是开源的。以前我一直是机械地敲着业务代码&#xff0c;好像计算机程序就只能干这点事情一样&#xff0c;而 C…

基于缎蓝园丁鸟算法优化概率神经网络PNN的分类预测 - 附代码

基于缎蓝园丁鸟算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于缎蓝园丁鸟算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于缎蓝园丁鸟优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

[CANN训练营]UART通信笔记

文章目录 前言一、前提知识1.串行通信2.并行通信3.单工、半双工、全双工通信3.1单工通信3.2半双工通信3.3全双工通信 4.补充&#xff1a;通信速率 二、UART通信1.UART通信2.UART工作原理 总结 前言 在ROS学习中&#xff0c;我们在入门基础除了ROS的小乌龟外&#xff0c;在通信…

【云栖2023】林伟:大数据AI一体化的解读

本文根据2023云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;林伟 | 阿里云研究员&#xff0c;阿里云计算平台事业部首席架构师&#xff0c;阿里云人工智能平台PAI和大数据开发治理平台DataWorks负责人 演讲主题&#xff1a;大数据AI一体化…

UMI4 AntDesignProV5 如何修改favicon 及放置的位置(AntDesignProV5 V4对比)

项目场景&#xff1a; 修改系统的favicon.ico AntDesignProV4 修改方式 因为在V4版本中&#xff0c;有根目录文件&#xff0c;可在文件中直接指定&#xff1a; <!-- document.ejs --><head><link rel"icon" type"image/x-icon" href&quo…

一篇揭秘Linux高性能服务epoll 的本质

导语 epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。其经常应用于Linux下高并发服务型程序&#xff0c;特别是在大量并发连接中只有少部分连接处于活跃下的情况 (通常是这种情况)&#xff0c;在该情况下能…

卫星位置解算

武大GPS原理及应用 1.广播星历&#xff08;预报星历&#xff09; 预报星历所得的轨道精度有限&#xff0c;精度在2m左右。 2.精密星历 P 、卫星PRN、卫星在地心地固坐标系坐标&#xff08;与wgs84有点差别&#xff09;、卫星钟差。 通过内插或者拟合来获取任意时刻的卫星位…

python---数据库操作

python的错误和异常 异常&#xff1a; 运行期检测到的错误被称为异常。 try语句按照如下方式工作&#xff1a; 首先&#xff0c;执行try子句&#xff08;在关键字try和关键字except之间的语句&#xff09; 如果没有异常发生&#xff0c;忽略except子句&#xff0c;try子句执…

Federated Social Recommendation with Graph Neural Network

基于图神经网络的联合社交推荐 ACM-TIST CCF_B类 论文链接 代码地址 模型中梯度和embedding的聚合 在FeSog中&#xff0c;Server端维护一个整体的model&#xff0c;由于这里的model层网络和GraphAttentionLayer层网络中一共有10个要更新参数&#xff0c;所以当每次server端将…

对测试职业发展的思考

虽然在测试行业摸爬滚打了很年&#xff0c;随着年龄的增长&#xff0c;职位的升迁&#xff0c;似乎已经走到了尽头&#xff0c;因而还是时不时觉得自己的职业发展目标很模糊&#xff0c;这是最近对自己职业发展的一些思考&#xff0c;希望与大家进行分享和探讨&#xff1a; 1、…

3、Linux库的生成和使用(核心代码是程序员不可公开的小秘密)

目录 Linux库的概念 Linux 静态库 Linux 静态库作用 Linux 静态库的创建 1. 将.c文件生成.o文件 ​编辑 2. 将所有的.o文件归档为一个静态库.a文件 Linux 静态库的使用 Linux 动态库&#xff1a; Linux 动态库作用 Linux 动态库的创建 生成.so动态库文件 ​编辑 …

curl(八)时间和环境变量以及配置

一 时间 ① --connect-timeout 连接超时时间 ② -m | --max-time 数据最大传输时间 -m&#xff1a; 限制curl 完成时间(overall time limit)-m,--max-time <seconds> 整个交互完成的超时时间场景&#xff1a; 通过设置-m参数,可以避免请求时间过长而导致的超时错误…

jstack java堆栈跟踪工具

jstack java堆栈跟踪工具 1、jstack介绍 jstack&#xff08;stack trace for java&#xff09;是java虚拟机自带的一种堆栈跟踪工具。 jstack主要用于生成java虚拟机当前时刻的线程快照&#xff0c;线程快照是当前java虚拟机内每一条线程正在执行的方法 堆栈的集合&#xf…

MacOS Ventura 13 优化配置(ARM架构新手向导)

一、系统配置 1、About My MacBook Pro 2、在当前标签打开新窗口 桌面上创建目录的文件夹&#xff0c;每次新打开一个目录&#xff0c;就会创建一个窗口&#xff0c;这就造成窗口太多&#xff0c;不太好查看和管理&#xff0c;我们可以改成在新标签处打开新目录。需要在&…

数字滤波器设计---IIR 滤波器设计

数字滤波器设计---IIR 滤波器设计 IIR 与 FIR 滤波器的比较 与 FIR 滤波器相比&#xff0c;IIR 滤波器的主要优点是&#xff0c;要满足同一组设定&#xff0c;它的滤波器阶数通常远远低于 FIR 滤波器。虽然 IIR 滤波器具有非线性相位&#xff0c;但 MATLAB 软件中的数据处理通…

【数据分享】我国雏鹰企业数据(excel格式\shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平&#xff01;比如一个城市的金融企业较多&#xff0c;那这个城市的金融产业肯定比较发达&#xff1b;一个城市的制造业企业较多&#xff0c;那这个城市的制造业肯定比较发达。 本次我们为大家带来的…

jumpserver任意密码重置漏洞-CVE-2023-42820

目录 jumpserver 环境搭建 这里用的是vulhub靶场 进入 jumpserver 的目录 修改配置文件 config.env 里面的 DOMAINS 参数为kali的地址 运行环境&#xff0c;第一次运行的话会拉取文件&#xff0c;要耐心等待。 命令&#xff1a; 查看docker容器 命令&#xff1a; 用浏…

【分享】Excel“只读方式”的两种模式

查阅Excel表格的时候&#xff0c;担心不小心修改了内容&#xff0c;可以给Excel设置以“只读方式”打开&#xff0c;这样就算修改了内容也不能直接保存表格。Excel表格可以设置两种“只读方式”&#xff0c;一起来看看吧&#xff01; “只读方式” 1&#xff1a; 打开Excel表…

找工作什么平台最可靠

吉鹿力招聘网是最可靠的找工作平台。可以直接和HR沟通岗位情况&#xff0c;方便快捷。同时&#xff0c;吉鹿力招聘网还有一些其他功能&#xff0c;比如可以找到更精准的人才&#xff0c;以及专业的招聘网站&#xff0c;可以帮助求职者找到合适的职位。吉鹿力招聘网还有一个特点…