C++的编译和链接过程详解

C++编译链接过程详解 1.基本概念1.编译编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。如果编译通过,就会把对应的CPP转换成OBJ文件。 2.编译单元:根据C++标准,每一个CPP文件就是一个编译单元。每个编译单元之间是相互独立并且互相不可知。 3.目标文件:由编译所生成的文件,以机器码的形式包含了编译单元里所有的代码数据 阅读详情

1、 编译器和链接器

        C++调用gcc编译命令进行编译(不同编译器有所不同),调用link命令进行链接。例如:

              gcc 1.cpp -o 1.o
             gcc 2.cpp -o 2.o
             gcc 3.cpp -o 3.o

       生成三个文件1.o,2.o以及3.o。然后调用link命令:

       link 1.o 2.o 3.o -o App.exe

       生成可执行程序。

2、 C++编译链接分析

   1) 编译成目标文件

      编译:编译器对源代码进行编译,是将以文本形式存在的源代码翻译为机器语言形式的目标文件的过程。

     编译单元:对于C++来说,每一个cpp文件就是一个编译单元。从之前的编译过程的演示可以看出,各个编译单元之间是互相不可知的。
    目标文件:由编译所生成的文件,以机器码的形式包含了编译单元里所有的代码和数据,以及一些其他的信息。、

2) 目标文件

     每一个目标文件除了拥有自己的数据和二进制代码外,还提供了三个表:未解决符号表、导出符号表和地址重定向表。

    未解决符号表提供了所有在该编译单元里引用但是定义并不在本编译单元里的符号及其出现的地址。
    导出符号表提供了本编译单元具有定义,并且愿意提供给其他编译单元使用的符号及其地址。
    地址重定向表提供了本编译单元所有对自身地址的引用的记录。

3) 目标文件的链接

     链接器进行链接的时候,首先决定各个目标文件在最终可执行文件里的位置。然后访问所有目标文件的地址重定向表,对其中记录的地址进行重定向(即加上该编译单元实际在可执行文件里的起始地址)。然后遍历所有目标文件的未解决符号表,并且在所有的导出符号表里查找匹配的符号,并在未解决符号表中所记录的位置上填写实际的地址(也要加上拥有该符号定义的编译单元实际在可执行文件里的起始地址)。最后把所有的目标文件的内容写在各自的位置上,再作一些别的工作,一个可执行文件就链接完成了。

3、 C++常用情景分析

1) extern

   编译器将extern声明的变量置入未解决符号表中,而不置入导出符号表中。(外部链接)

2)static

   编译器将static声明的全局变量既不置入未解决符号表中,也不置入导出符号表中。(内部链接)因此别的编译单元无法使用。

3)普通变量函数

普通变量及函数被置入导出符号表中。

AI编程工具选哪个更高效?开发者深度评测 无论是代码生成、错误修复,还是架构设计,AI都能提供强大的辅助能力。然而,市面上AI编程工具众多,如何选择最适合自己的?本文将从代码质量、响应速度、多语言支持、集成能力等多个维度,为你解析2025年最主流的几款AI编程工具,帮助你做出更高效的选择。根据2025年最新调研数据,全球超过85%的开发者正在使用AI编程工具辅助开发,相比2023年增长了近40%。合理利用AI,能让你的开发效率提升数倍,但真正的核心竞争力,仍然在于你的编程思维解决问题的能力。:技术较强的开发者、重视数据隐私的企业。 阅读详情

相关推荐

ADS入门学习笔记——射频振荡器的设计

振荡器是射频系统中的基本部件之一,可以将直流功率转换为射频功率,在特定的频率点建立起稳定的正弦振荡,成为所需的射频信号源。

weixin_42126696的博客 8817

C++ 编译链接、静态链接库、动态链接库原理总结

简单说下总体流程:。预处理阶段:

z164470的博客 3403

Zephyr开发指南——编程语言支持( C++语言支持)

Zephyr支持同时用CC-++编写的应用程序。但是,要在应用程序中使用C++,您必须通过在应用程序配置文件中选择CONFIG_CPLUSPLUS来配置Zephyr以包含C++支持。

wayne2018的博客-心情驿站 718

C++编译、连接

Windows中我们常用vs来编译编写好的CC++代码,vs把编辑器,编译器调试器等工具都集成在这一款工具中。linux下,通常我们使用vim编辑器,然后用gccg++编译链接生成可执行程序。 我们很难说 C++ 拥有独立的编译器,例如 Windows 下的微软编译器(cl.exe)、Linux 下的 GCC 编译器、Mac 下的 Clang 编译器(已经是 Xcode 默认编译器,雄心...

赶路人儿 1867

zephyr开启C++ 支持

zephyr支持c++

m0_37876242的博客 393

嵌入式C++开发新范式:Zephyr RTOS极简入门指南

你是否还在为嵌入式系统中C++的内存管理、异常处理发愁?是否因RTOS对C++支持不足而被迫退回C语言开发?本文将以Zephyr RTOS为核心,通过3个实战步骤+2个典型案例,带你掌握嵌入式C++开发全流程,最终实现一个支持面向对象编程的传感器应用。 ## 一、Zephyr RTOS的C++支持架构 Zephyr通过分层设计实现C++支持,核心组件位于[lib/cpp/](https://li...

gitblog_00787的博客 519

C/C++编译链接过程详解 (重定向,导出符号,未解决符号)

详解link  有 些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行)。或者对语言的一些部分不知道为什么要(或者不要)这样那样设计。了解本文之后, 或许会有一些答案。      首先看看我们是如何写一个程序的。如果你在使用某种IDE(Visu

1万+

translation unit cpp文件

C++中,是两个紧密相关但处于不同层面的核心概念。简单来说,.cpp文件是你在硬盘上看到的物理源文件,而翻译单元则是编译器眼中处理的基本逻辑单位。#include.cpp.cpp下面我们来详细解析一下。

FantasticOrange的博客 1444

C++100问】C/C++程序执行过程详解之预处理、编译、汇编、链接执行,以及g++/gcc的安装使用

专栏C++学习笔记 ???? 声明: 1)本文仅供学术交流,非商用。 2)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 3)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。 4)大家都共享一点点,一起为祖国科研的推进添砖加瓦。 文章目录专栏C++学习笔记???? 声明:???? 学习路线〇、✏ 前言一、✏ 正文1、✏ 预处理2、✏ 汇编3、✏ 编译4、✏ 链接5、✏ 执行二、✏ 安装...

种树最好的时间是10年前,其次是现在!!! 3219

详解C++代码从源代码到可执行文件的整个编译过程(预处理、编译、汇编链接

C++代码从源代码到可执行文件的生成过程,通常包括以下四个阶段:预处理、编译、汇编链接。每个阶段都有特定的任务目标。

不会编程的码农研究僧 2483

C/C++ 编译链接过程详解 (重定向,导出符号,未解决符号)

详解link 有 些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行)。或者对语言的一些部分不知道为什么要(或者不要)这样那样设计。了解本文之后, 或许会有一些答案。     首先看看我们是如何写一个程序的。如果你在使用某种IDE(Visual S...

weixin_34211761的博客 128

atmel SAM-BA2.12

atmel 系列芯片程序烧写工具,该版本为sam-ba 2.12。个人感觉该版本稳定性更好一些。

上一篇: Test Experience Share: We should consider the impact of the hardware improvement to the test code
下一篇: 单元测试的重要性
tomtestingresearch
博客等级 码龄16年 1粉丝 9原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值