0

0

c++ 编译和链接过程 c++代码如何变成可执行文件

月夜之吻

月夜之吻

发布时间:2026-03-18 20:52:31

|

331人浏览过

|

来源于php中文网

原创

C++构建分编译(预处理、编译、汇编)和链接两阶段:预处理展开宏与头文件,编译生成汇编,汇编生成目标文件(.o),链接合并多个.o及库并解析符号地址;常见错误如undefined reference源于漏链接或依赖顺序不当,-c、-E、-S等选项可控制流程,依赖管理需构建系统支持。

c++ 编译和链接过程 c++代码如何变成可执行文件

编译阶段:预处理、编译、汇编三步走,g++ 默认连着干

你写的 .cpp 文件不是直接变机器码的,中间要过三道关。预处理展开 #include#define,编译器把 C++ 语法翻译成汇编指令,最后汇编器把汇编转成目标文件(.o.obj)。g++ 默认一步到位,但加 -c 就停在目标文件这步:g++ -c main.cpp 生成 main.o,不生成可执行文件。

常见错误现象:undefined reference to `main' 这类链接错误,其实常是因为漏了 -c 之后没继续链接,或者多个 .o 没一起喂给链接器。

  • 预处理用 g++ -E main.cpp 看展开后长啥样,特别适合查宏定义没生效的问题
  • g++ -S main.cpp 只到汇编,生成 main.s,能确认编译器是否真按你预期优化或内联
  • 不同源文件各自 -c 生成 .o,是增量编译的基础,改一个文件不用全重编

链接阶段:把多个 .o 和库拼成一个 exea.out

目标文件里有符号(比如函数名、全局变量),但地址全是“占位符”。链接器负责填上真实内存地址,并解决跨文件引用。你写 std::cout,实际调用的是 libstdc++ 里的实现,链接时得把那部分代码也塞进来。

典型卡点:undefined reference to `foo()' 表示链接器在所有输入文件和库里都找不到 foo 的定义;multiple definition of `bar' 是同一个符号在多个 .o 里都定义了(比如头文件里写了非 inline 函数实现)。

立即学习C++免费学习笔记(深入)”;

Elser AI
Elser AI

一站式AI动漫、短剧生成平台

下载
  • 手动链接:把所有 .o 一次性传给 g++,比如 g++ main.o utils.o -o programg++ 此时只做链接,不重新编译
  • 静态库是 .a 文件,本质是一堆 .o 打包,链接时用 -L/path/to/lib -lmylib;动态库是 .so(Linux)或 .dll(Windows),运行时才加载
  • 链接顺序有影响:依赖别人的模块放前面,被依赖的放后面,否则可能报未定义——g++ app.o -lm 对,g++ -lm app.o 在老版本 ld 上可能失败

g++ 一条命令背后的隐式步骤和开关控制

你以为 g++ main.cpp -o program 是“编译并链接”,其实它悄悄调了预处理器、编译器、汇编器、链接器四道程序。你可以用 -v 看它到底执行了哪些命令,路径、参数、默认库路径全打出来,调试构建问题时非常管用。

容易忽略的细节:C++ 标准库不是自动“免费”链接的。比如用了 std::thread 却没加 -pthread,Linux 下会链接失败;用了 std::filesystem(C++17),得显式加 -lstdc++fs

  • -x c++ 强制把后缀非 .cpp 的文件当 C++ 处理,比如编译 main.ccg++ 有时会误判为 C
  • -nostdlib 完全不链标准启动代码和库,裸机或嵌入式开发才用,日常别碰
  • -Wl,--no-as-needed 让链接器不跳过看起来“没用”的库,某些依赖间接调用的场景需要

为什么改了头文件却没重新编译?依赖关系谁在管

编译器自己不管依赖,g++ 生成的 .o 也不记录“我依赖哪些头文件”。所以你改了 utils.h,如果构建系统没告诉它 main.o 要重做,就会用旧的目标文件,导致行为不一致。

Makefile 或 CMake 的核心任务之一,就是维护这种依赖关系。C++ 编译器可以通过 -M 系列选项生成依赖规则:g++ -MM main.cpp 输出 main.o: main.cpp utils.h 这样的行,供 Make 读取。

  • -M 输出所有依赖(含系统头),-MM 只输出用户头文件,更实用
  • CMake 默认开启依赖扫描,但如果你手写 add_executable 时漏了某个 .h 文件,它不会自动感知——头文件不参与构建规则生成,除非你显式 target_sources(... PRIVATE ...)
  • IDE(如 VS Code + CMake Tools)有时缓存旧的依赖图,改完头文件后清一下 build/ 目录再生成,比猜“为啥没生效”快得多
C++ 构建过程里最麻烦的从来不是语法转换,而是符号怎么找、什么时候找、从哪找——链接时报错往往离真正出问题的代码隔了两层抽象,而依赖管理又藏在构建系统背后,看不见摸不着。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

120

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

395

2023.10.11

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

103

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

127

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

3

2026.03.17

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

449

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

102

2025.12.01

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

7

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号