news 2026/7/1 23:35:21

预处理到可执行文件:一文说清编译各阶段任务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
预处理到可执行文件:一文说清编译各阶段任务

以下是对您提供的技术博文《预处理到可执行文件:编译全流程深度技术解析》的全面润色与重构版本。本次优化严格遵循您的全部要求:

✅ 彻底去除AI痕迹,语言自然、专业、有“人味”——像一位在嵌入式一线摸爬滚打十年的老工程师,在茶水间边泡茶边给你讲清楚整个编译链;
✅ 打破刻板模块化结构,取消所有“引言/概述/总结/展望”等套路标题,代之以逻辑递进、层层深入、有呼吸感的技术叙事流
✅ 将“预处理→编译→汇编→链接”四阶段,转化为一条真实工程问题驱动的主线:从一个MCU固件烧不进去的报错开始,倒推回每一环可能埋下的雷;
✅ 关键概念不堆术语,而是用类比+实操+陷阱复现的方式讲透(例如:“宏不是函数,它是剪刀手”、“.o文件就像没拼好的乐高,每块都标了编号但还没对齐位置”);
✅ 所有命令、参数、代码片段均保留并增强上下文解释,附带真实调试场景中的使用心得(比如-dM不是为了炫技,而是你在交叉编译RISC-V时发现__riscv没定义,必须靠它定位头文件污染源);
✅ 删除所有空泛结语,结尾落在一个具体、可延展、有张力的技术动作上——不是“未来可期”,而是“你现在就可以打开终端试一句”。


为什么我的固件烧不进STM32?——从一个undefined reference to 'printf'说起

上周五下午三点,你对着J-Link烧录器发呆。firmware.bin生成成功,但OpenOCD提示:Failed to halt target;换个角度想,也许根本不是调试器的问题——你把firmware.elf拖进readelf -a一看,赫然发现:

Symbol table '.symtab' contains 127 entries: 56: 00000000 0 NOTYPE GLOBAL DEFAULT UND printf

UND?未定义?可你明明写了#include <stdio.h>,也加了-lc链接选项……
别急着重装工具链。这个问题,大概率不是链接器坏了,而是你从未真正看清过自己写的那行printf("hello"),是怎么从键盘敲下,变成Flash里一串字节的

我们来走一遍这条路径。不是教科书式的“四阶段流程”,而是一次带着问题、踩着坑、亲手拆解的逆向溯源


第一站:预处理——你以为你写的是C,其实CPP只当它是纯文本

先别碰gcc -c。回到源头,执行这句:

arm-none-eabi-gcc -E -dM -I./inc app.c > app.i

注意两个关键点:
--E:停在预处理后,不往后走;
--dM:强制输出所有宏定义,包括GCC内置的__ARM_ARCH_7M____GNUC__,还有你自己在config.h里写的#define ENABLE_LOG 1

打开app.i,你会震惊:
- 原本300行的app.c,变成了12,487行
- 所有#include "driver_uart.h"都被展开成几千行寄存器定义;
- 每个LOG_INFO("cnt=%d", cnt),都已变成do { if(ENABLE_LOG) printf("[INFO] cnt=%d\n", cnt); } while(0); <

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 22:45:10

小白也能用!Qwen-Image-Layered图层拆分实战教程

小白也能用&#xff01;Qwen-Image-Layered图层拆分实战教程 你是否遇到过这样的困扰&#xff1a;一张精心设计的海报&#xff0c;想单独调整文字颜色却怕误伤背景&#xff1f;一个产品图里人物和背景粘连紧密&#xff0c;抠图后边缘毛糙、反复重试&#xff1f;或者想把旧照片…

作者头像 李华
网站建设 2026/7/1 22:49:33

2024年AI语音应用趋势:Emotion2Vec+ Large开源模型部署入门必看

2024年AI语音应用趋势&#xff1a;Emotion2Vec Large开源模型部署入门必看 1. 为什么Emotion2Vec Large值得你今天就上手 你有没有想过&#xff0c;一段3秒的语音里藏着多少情绪密码&#xff1f;不是靠猜&#xff0c;而是用AI真正“听懂”——愤怒的紧绷、惊喜的上扬、疲惫的…

作者头像 李华
网站建设 2026/7/1 1:52:23

基于Java+SpringBoot+SSM河南特色美食分享系统(源码+LW+调试文档+讲解等)/河南美食推荐系统/河南特色小吃平台/河南美食分享平台/河南地方美食系统/河南特色美食介绍系统

博主介绍 &#x1f497;博主介绍&#xff1a;✌全栈领域优质创作者&#xff0c;专注于Java、小程序、Python技术领域和计算机毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2025-2026年最新1000个热门Java毕业设计选题…

作者头像 李华
网站建设 2026/7/1 10:05:48

Paraformer-large节能模式:空闲时自动降低GPU功耗

Paraformer-large节能模式&#xff1a;空闲时自动降低GPU功耗 语音识别模型在实际部署中&#xff0c;常常面临一个被忽视却影响深远的问题&#xff1a;GPU资源持续占用带来的隐性成本。尤其当Paraformer-large这类高性能ASR模型以离线方式长期运行Web服务时&#xff0c;即使界…

作者头像 李华
网站建设 2026/7/1 16:40:23

CAM++语音搜索功能实现:声纹检索系统搭建

CAM语音搜索功能实现&#xff1a;声纹检索系统搭建 1. 什么是CAM声纹检索系统 CAM不是简单的语音转文字工具&#xff0c;而是一个专注“听声辨人”的专业级声纹识别系统。它由开发者科哥基于达摩院开源模型二次开发而成&#xff0c;核心能力是把人的声音变成一组独特的数字指…

作者头像 李华
网站建设 2026/7/1 10:05:54

新手必看:Qwen3-Embedding-0.6B安装与调用全解析

新手必看&#xff1a;Qwen3-Embedding-0.6B安装与调用全解析 你是不是也遇到过这些问题&#xff1a; 想给自己的搜索系统加语义理解能力&#xff0c;却卡在向量模型部署上&#xff1b; 听说Qwen3 Embedding效果很好&#xff0c;但不知道从哪一步开始跑通&#xff1b; 试了几个…

作者头像 李华